Solución:
Tiene un problema, principalmente porque está utilizando un objeto personalizado. Si pasa un valor String o int al adaptador de matriz, sabrá cómo filtrarlo. Pero si pasa la implementación del filtro predeterminado de objeto personalizado, no tendrá idea de cómo lidiar con eso.
Aunque no está claro qué está intentando hacer en su filtro, le recomiendo que siga los pasos.
- Implementación adecuada de
ListTO
, aunque no tiene nada que ver con tu objetivo en este momento - Implementar filtro personalizado
- devuelve tu filtro
Implementar filtro personalizado
Lo primero que tienes que hacer es implements
Filterable
desde su adaptador de matriz.
En segundo lugar, proporcione la implementación de su Filter
Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
ArrayList<ListTO> tempList=new ArrayList<ListTO>();
//constraint is the result from text you want to filter against.
//objects is your data set you will filter from
if(constraint != null && objects!=null) {
int length=objects.size();
int i=0;
while(i<length){
ListTO item=objects.get(i);
//do whatever you wanna do here
//adding result set output array
tempList.add(item);
i++;
}
//following two lines is very important
//as publish result can only take FilterResults objects
filterResults.values = tempList;
filterResults.count = tempList.size();
}
return filterResults;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
objects = (ArrayList<ListTO>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
Último paso,
@Override
public Filter getFilter() {
return myFilter;
}
No es necesario escribir un adaptador de matriz. escribe un método toString () que debería devolver el valor de nombre de archivo.
Igual que
public class ListTO {
public int Id;
public String FileName;
public String FileUri;
public ListTO(int id, String fileName, String fileUri) {
Id = id;
FileName = fileName;
FileUri = fileUri;
}
public String toString(){
return FileName
}
}
Necesita anular el getFilter()
en el Adaptador y proporcione su propio filtro. Eche un vistazo a este ejemplo filtrable para ver una implementación real.
Agregue lo siguiente getFilter()
código a tu FilterableAdapter
class y rellénelo con su filtrado:
/* (non-Javadoc)
* @see android.widget.ArrayAdapter#getFilter()
*/
@Override
public Filter getFilter() {
return new Filter() {
/* (non-Javadoc)
* @see android.widget.Filter#performFiltering(java.lang.CharSequence)
*/
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// TODO Auto-generated method stub
/*
* Here, you take the constraint and let it run against the array
* You return the result in the object of FilterResults in a form
* you can read later in publichResults.
*/
return null;
}
/* (non-Javadoc)
* @see android.widget.Filter#publishResults(java.lang.CharSequence, android.widget.Filter.FilterResults)
*/
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
// TODO Auto-generated method stub
/*
* Here, you take the result, put it into Adapters array
* and inform about the the change in data.
*/
}
};
}
Agregué sugerencias sobre qué hacer en los comentarios.