Bu konuyla hala ilgilenen biri varsa, listeleri filtrelemek için en iyi yaklaşımın genel bir Filtre sınıfı oluşturmak ve bunu Java eski okul SDK paketinde bulunan bazı temel yansıtma / genel tekniklerle kullanmak olduğunu görüyorum. İşte yaptığım şey:
public class GenericListFilter<T> extends Filter {
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);
}
}
}
@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;
}
@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();
}
}
private ArrayAdapter<T> mAdapterUsed;
private List<T> mInternalList;
private Method mCompairMethod;
}
Ve daha sonra yapmanız gereken tek şey, filtreyi, adaptör referansınızı, listenizi ve filtreleme için çağrılacak yöntemi ileten bir üye sınıf olarak (muhtemelen View'un "onCreate" içinde) oluşturmaktır:
this.mFilter = new GenericFilter<MyObjectBean> (list, "getName", adapter);
Şu anda eksik olan tek şey, adaptör sınıfındaki "getFilter" yöntemini geçersiz kılmaktır:
@Override public Filter getFilter () {
return MyViewClass.this.mFilter;
}
Hepsi tamam! Listenizi başarılı bir şekilde filtrelemelisiniz - Elbette, filtre algoritmanızı ihtiyacınızı en iyi tanımlayan şekilde uygulamalısınız, aşağıdaki kod sadece bir örnektir. . Umarım yardımcı olmuştur, kendine iyi bak.