2012-04-04 15 views
12

parece que el caso de uso de un Adapter que es Filterable es filtrar por una o StringCharSequence que podrían ser introducidos por el usuario en un EditText, pero ¿es realmente el único criterio que ofrece la plataforma para filtrar Adapter s?Filtro ListAdapter que no sea el uso de cadenas?

¿Qué sucede si tengo una estructura de datos de respaldo de objetos que pueden categorizarse de otra manera? por ejemplo, ¿qué sucede si tengo una lista de objetos de Camisa que tienen un atributo enum, color? El usuario debe poder filtrar la lista de camisas de una lista de color s disponibles. Como buen desarrollador de aplicaciones, quiero usar las plataformas integradas en el mecanismo de filtrado, pero todo lo que puedo encontrar es Filter con métodos como filter (CharSequence constraint). Debo estar perdiendo algo. Veo cómo sería bastante simple implementar este mecanismo de filtrado dentro de mi propio BaseAdapter personalizado, pero parece que debería haber algunos integrados para hacer filtros personalizados. ¿Nadie? Gracias por adelantado.

+0

FacebookSDK 3.0 tiene una forma de filtrar en otros parámetros. El problema es que han implementado la nueva clase de filtro desde cero. Compruebe PickerFragment.GraphObjectFilter para obtener más información. – mach

+1

No puedo creer que esta pregunta no tenga más vistas y más votos. La realidad detrás de la pregunta del OP pone de relieve una exclusión completamente idiota del núcleo del marco de Android. Filtrado en cualquier cosa que no sea String's? ¿Quién demonios necesita eso? Increíble – wkhatch

Respuesta

0

En Android, el adaptador puede aplicar la Filtrable (que puede ser el mismo con el filtro buscado)
=> Esta es la conexión entre los datos con el filtro.
Aquí está el enlace [Debería ver la respuesta marcada] List View Filter Android

0

puede crear su propia FilterAdapter y llevar sus propias lógicas, por ejemplo, éste cuidar de objeto con dos cuerdas y gestionar el filtro:

public class TwoWordsFilter extends Filter { 
ArrayList<BranchData> branchDatas = new ArrayList<BranchData>(); 
private BranchDataAdapter branchDataAdapter; 
public TwoWordsFilter(ArrayList<BranchData> branchDatas,BranchDataAdapter branchDataAdapter) { 
    this.branchDatas = branchDatas; 
    this.branchDataAdapter=branchDataAdapter; 
} 

@Override 
protected FilterResults performFiltering(CharSequence constraint) { 
    FilterResults results = new FilterResults(); 
    if (constraint==null || constraint.length()==0){ 
     results.values=branchDatas; 
     results.count=branchDatas.size(); 
    }else { 
     List<BranchData> mBranchDatas=new ArrayList<BranchData>(); 
     for (BranchData branchData : branchDatas) { 
      if (branchData.getBranch_name().trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase()) || 
      branchData.getCity().trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase())){ 
       mBranchDatas.add(branchData); 
      } 
     } 
     results.values=mBranchDatas; 
     results.count=mBranchDatas.size(); 

    } 
    return results; 
} 

@Override 
protected void publishResults(CharSequence constraint, FilterResults results) { 
    if (results.count == 0) 
     branchDataAdapter.notifyDataSetInvalidated(); 
    else { 
     branchDataAdapter.setBranchDatas((ArrayList<BranchData>) results.values); 
     branchDataAdapter.notifyDataSetChanged(); 
    } 
} 

}

en su adaptador de poner esto:

@Override 
public Filter getFilter() { 
    if (twoWordsFilter==null){ 
     twoWordsFilter=new TwoWordsFilter(branchDatas,this); 
    } 
    return twoWordsFilter; 
} 
Cuestiones relacionadas