Filtre d’affichage de liste Android

J’ai créé une vue de liste dans Android et je veux append du texte d’édition au-dessus de la liste et lorsque l’utilisateur saisit du texte, la liste sera filtrée en fonction de la saisie de l’utilisateur.

quelqu’un peut-il me dire s’il y a un moyen de filtrer l’adaptateur de liste dans Android?

Oui. Ajouter un EditText en haut de votre listview dans son fichier de mise en page aml. Et dans votre activité / fragment ..

lv = (ListView) findViewById(R.id.list_view); inputSearch = (EditText) findViewById(R.id.inputSearch); // Adding items to listview adapter = new ArrayAdapter(this, R.layout.list_item, R.id.product_name, products); lv.setAdapter(adapter); inputSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text MainActivity.this.adapter.getFilter().filter(cs); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void afterTextChanged(Editable arg0) {} }); 

La base ici est d’append un OnTextChangeListener à votre texte d’édition et à l’intérieur de sa méthode de rappel, d’appliquer un filtre à l’adaptateur de votre listview.

MODIFIER

Pour obtenir un filtre sur votre BaseAdapter personnalisé, vous devrez implémenter une interface filtrable .

 class CustomAdapter extends BaseAdapter implements Filterable { public View getView(){ ... } public Integer getCount() { ... } @Override public Filter getFilter() { Filter filter = new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { arrayListNames = (List) results.values; notifyDataSetChanged(); } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); ArrayList FilteredArrayNames = new ArrayList(); // perform your search here using the searchConstraint Ssortingng. constraint = constraint.toSsortingng().toLowerCase(); for (int i = 0; i < mDatabaseOfNames.size(); i++) { String dataNames = mDatabaseOfNames.get(i); if (dataNames.toLowerCase().startsWith(constraint.toString())) { FilteredArrayNames.add(dataNames); } } results.count = FilteredArrayNames.size(); results.values = FilteredArrayNames; Log.e("VALUES", results.values.toString()); return results; } }; return filter; } } 

Dans perfromFiltering (), vous devez effectuer une comparaison réelle de la requête de recherche avec les valeurs de votre firebase database. Il passera son résultat à la méthode publishResults () .

Implémentez votre adaptateur Filtrable:

 public class vJournalAdapter extends ArrayAdapter implements Filterable{ private ArrayList items; private Context mContext; .... 

puis créez votre classe de filtre:

 private class JournalFilter extends Filter{ @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults result = new FilterResults(); List allJournals = getAllJournals(); if(constraint == null || constraint.length() == 0){ result.values = allJournals; result.count = allJournals.size(); }else{ ArrayList filteredList = new ArrayList(); for(JournalModel j: allJournals){ if(j.source.title.contains(constraint)) filteredList.add(j); } result.values = filteredList; result.count = filteredList.size(); } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results.count == 0) { notifyDataSetInvalidated(); } else { items = (ArrayList) results.values; notifyDataSetChanged(); } } } 

De cette façon, votre adaptateur peut être filtré, vous pouvez transmettre un élément de filtre au filtre de l’adaptateur et effectuer le travail. J’espère que cela sera utile.

Si quelqu’un s’intéresse encore à ce sujet, je trouve que la meilleure approche pour filtrer les listes est de créer une classe Filter générique et de l’utiliser avec certaines techniques de reflection / génériques de base contenues dans le package Java old school SDK. Voici ce que j’ai fait:

 public class GenericListFilter extends Filter { /** * Copycat constructor * @param list the original list to be used */ public GenericListFilter (List list, Ssortingng reflectMethodName, ArrayAdapter adapter) { super (); mInternalList = new ArrayList<>(list); mAdapterUsed = adapter; try { ParameterizedType stringListType = (ParameterizedType) getClass().getField("mInternalList").getGenericType(); mCompairMethod = stringListType.getActualTypeArguments()[0].getClass().getMethod(reflectMethodName); } catch (Exception ex) { Log.w("GenericListFilter", ex.getMessage(), ex); try { if (mInternalList.size() > 0) { T type = mInternalList.get(0); mCompairMethod = type.getClass().getMethod(reflectMethodName); } } catch (Exception e) { Log.e("GenericListFilter", e.getMessage(), e); } } } /** * Let's filter the data with the given constraint * @param constraint * @return */ @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); List filteredContents = new ArrayList<>(); if ( constraint.length() > 0 ) { try { for (T obj : mInternalList) { Ssortingng result = (Ssortingng) mCompairMethod.invoke(obj); if (result.toLowerCase().startsWith(constraint.toSsortingng().toLowerCase())) { filteredContents.add(obj); } } } catch (Exception ex) { Log.e("GenericListFilter", ex.getMessage(), ex); } } else { filteredContents.addAll(mInternalList); } results.values = filteredContents; results.count = filteredContents.size(); return results; } /** * Publish the filtering adapter list * @param constraint * @param results */ @Override protected void publishResults(CharSequence constraint, FilterResults results) { mAdapterUsed.clear(); mAdapterUsed.addAll((List) results.values); if ( results.count == 0 ) { mAdapterUsed.notifyDataSetInvalidated(); } else { mAdapterUsed.notifyDataSetChanged(); } } // class properties private ArrayAdapter mAdapterUsed; private List mInternalList; private Method mCompairMethod; } 

Et ensuite, la seule chose que vous devez faire est de créer le filtre en tant que classe membre (éventuellement dans le “onCreate” de View) en transmettant votre référence d’adaptateur, votre liste et la méthode à appeler pour le filtrage:

 this.mFilter = new GenericFilter (list, "getName", adapter); 

La seule chose qui manque maintenant, est de remplacer la méthode “getFilter” dans la classe d’adaptateur:

 @Override public Filter getFilter () { return MyViewClass.this.mFilter; } 

Terminé! Vous devez filtrer votre liste avec succès – Bien sûr, vous devez également implémenter votre algorithme de filtrage de la meilleure façon qui décrit votre besoin, le code ci-dessous n’est qu’un exemple. . J’espère que ça a aidé, prends soin de toi.