Nel caso in cui qualcuno sia ancora interessato a questo argomento, trovo che l'approccio migliore per gli elenchi di filtri sia quello di creare una classe Filter generica e utilizzarla con alcune tecniche di riflessione/generiche di base contenute nel pacchetto Java old school SDK. Ecco quello che ho fatto:
public class GenericListFilter<T> extends Filter {
/**
* Copycat constructor
* @param list the original list to be used
*/
public GenericListFilter (List<T> list, String reflectMethodName, ArrayAdapter<T> 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<T> filteredContents = new ArrayList<>();
if (constraint.length() > 0) {
try {
for (T obj : mInternalList) {
String result = (String) mCompairMethod.invoke(obj);
if (result.toLowerCase().startsWith(constraint.toString().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<T>) results.values);
if (results.count == 0) {
mAdapterUsed.notifyDataSetInvalidated();
}
else {
mAdapterUsed.notifyDataSetChanged();
}
}
// class properties
private ArrayAdapter<T> mAdapterUsed;
private List<T> mInternalList;
private Method mCompairMethod;
}
E dopo, l'unica cosa che devi fare è quello di creare il filtro come classe membro (possibilmente entro il View "onCreate") passando il vostro riferimento adattatore, la vostra lista, e la il metodo da chiamare per il filtraggio:
this.mFilter = new GenericFilter<MyObjectBean> (list, "getName", adapter);
l'unica cosa che manca ora, è quello di eseguire l'override del metodo "getFilter" nella classe di adattatori:
@Override public Filter getFilter() {
return MyViewClass.this.mFilter;
}
tutto fatto! Dovresti filtrare correttamente il tuo elenco - Naturalmente, dovresti anche implementare l'algoritmo del filtro nel modo migliore che descriva le tue necessità, il codice qui sotto è solo un esempio.. Spero che abbia aiutato, stammi bene.
Ciao prova questo esempio [Esempio uno] (https://rakhi577.wordpress.com/2012/06/26/buttons-on-list-view-with-easy-searching-in-android/) e il secondo uno [Esempio 2] (http://stackoverflow.com/questions/2463777/autocompletetextview-with-custom-list-how-to-set-up-onitemclicklistener) Ho implementato lo stesso basato su questo tutorial ... Spero che questo ti aiuterà – Pragnani
+1 l masr ..... –
La risposta migliore non ha fornito abbastanza informazioni per me. [Questa risposta] (http://stackoverflow.com/a/24771174/11912) a una domanda simile ha più contesto ed è stata esattamente abbastanza informazioni da farmi risolvere. –