Ver la Versión Completa : [ CONSULTA ] Filtrar elementos de un ListView
kaiser75
04/12/15, 17:15:24
Vereis, tengo una listview con un adapter personalizado, texto1, texto2 y un boton. Los textview texto 1 y texto 2 cargan una lista de nombres y descripciones desde un array cada uno y he implementado la busqueda en la actionbar para poder filtrar los elementos a mostrar, me funciona la busqueda pero no correctamente, por ejemplo al escribir una "a" en la actionbar me muestra algunos elementos de la lista, no todos pero algunos ni contienen esa letra por lo que no se corresponden con la busqueda, lo que quiero es que al escribir todo el nombre, por ejemplo me muestre solo los elementos que contengan ese nombre. Hay manera de crear un getFilter() personalizado?
SpliterMelon
10/12/15, 18:09:45
Saludos compañero!
Lo primero comentarte que meter un boton en un list view a veces no suele ser util bastaria con añadir un listener al list view para obtener el view que esta en esa posicion. igualmente nos centramos en tu problema.
Normalmente un post sin el codigo no vale de nada. yo me aseguraria de que filtras los elementos antes de añadirlos al list view y refrescas el mismo o a traves de alguno de los filtros mediante un vistazo al codigo comprobar donde puede surgir el error(Normalmente con un debug suele bastar)
Asique dicho esto quedo a la espera de que publiques algo de codigo paara poder ayudarte mejor.
:cucu:
kaiser75
10/12/15, 19:27:38
Gracias SpliterMelon, lo del boton en el listview es porque es una lista de sonidos con un nombre, la descripcion y el boton para reproducir el sonido, te comento lo que tengo.
Tengo un ArrayAdapter personalizado con los textos y el boton, en el onCreate tengo este codigo para montar los elementos en el listview:
CustomList adapter = new CustomList(Actividad1.this, nombre, frases, boton); // filtrar los campos con esta etiqueta
list = (ListView) findViewById(R.id.lista1);
((CustomList) adapter).setCustomButtonListner(Actividad1.this);
list.setAdapter(adapter);
despues este es el Adapter, en la misma Actividad1
public class CustomList extends ArrayAdapter<String> implements Filterable {
customButtonListener customListner;
private final Activity context;
private final String[] nom;
private final String[] frase;
private final Button boton;
public void setCustomButtonListner(customButtonListener listener) {
this.customListner = listener;
}
public CustomList(Activity context, String[] nom, String[] frase,Button boton) {
super(context, R.layout.adapter_doble, frase);
this.context = context;
this.nom = nom;
this.frase = frase;
this.boton = boton;
}
override
public long getItemId(int position) {
return position;
}
override
public View getView(final int position, View convertView,
ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.adapter_doble, null);
viewHolder = new ViewHolder();
viewHolder.nom = (TextView) convertView.findViewById(R.id.nombre1);
viewHolder.frase = (TextView) convertView.findViewById(R.id.frase1);
viewHolder.boton = (Button) convertView.findViewById(R.id.boton1);
convertView.setTag(viewHolder);
registerForContextMenu(viewHolder.boton);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final String temp = getItem(position);
viewHolder.nom.setText(nombre[position]);
viewHolder.frase.setText(frases[position]);
viewHolder.boton.setOnClickListener(new OnClickListener() {
override
public void onClick(View v) {
if (customListner != null) {
customListner.onButtonClickListner(position, temp);
mp = MediaPlayer.create(Actividad1.this,sonidos[position]);
mp.start();
}
}
});
return convertView;
}
public Filter getFilter() {
return null;
}
public class ViewHolder {
TextView nom;
TextView frase;
Button boton;
}
}
y este es el menu que muestra el campo de busqueda en la ActionBar
override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_secciones, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.buscar).getActionView();
searchView.setSearchableInfo(searchManager.getSear chableInfo(getComponentName()));
searchView.setQueryHint(getString(R.string.search_ hint));
SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener()
{
override
public boolean onQueryTextChange(String newText)
{
adapter.getFilter().filter(newText);
return true;
}
override
public boolean onQueryTextSubmit(String query)
{
adapter.getFilter().filter(query);
return true;
}
};
searchView.setOnQueryTextListener(textChangeListen er);
return super.onCreateOptionsMenu(menu);
}
Asi me funciona correctamente, lo unico que no se como crear el filtro personalizado para filtrar los elementos solo con el texto "nombre", al hacer la busqueda me filtra la lista pero los elementos que se muestran en la lista no se corresponden con lo que se escribe en la busqueda.
kaiser75
16/12/15, 11:59:46
Alguien sabe como filtrar los resultados de la lista correctamente?
kaiser75
28/12/15, 20:00:50
Alguna ayuda para poder crear una logica personalizada para poder filtrar la lista correctamente?
beta tester
28/12/15, 21:49:44
Debes implementar tu propio filtro en el método getFilter dentro de la correspondiente implementación del Adapter. Ahí es donde debe ir toda la lógica de filtrado: filtrar por un texto u otro, o incluso por ambos.
Haciendo una búsqueda rápida en StackOverflow he encontrado un ejemplo que te puede servir de ayuda http://stackoverflow.com/a/19301216
:nav3:
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.