Trong trường hợp bất kỳ ai vẫn quan tâm đến chủ đề này, tôi thấy rằng cách tiếp cận tốt nhất để lọc danh sách là tạo một lớp Lọc chung và sử dụng nó với một số kỹ thuật phản ánh / chung cơ sở có trong gói Java old school SDK. Đây là những gì tôi đã làm:
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;
}
Và sau đó, điều duy nhất bạn cần làm là tạo bộ lọc dưới dạng lớp thành viên (có thể trong "onCreate" của Chế độ xem) chuyển tham chiếu bộ điều hợp, danh sách của bạn và phương thức được gọi để lọc:
this.mFilter = new GenericFilter<MyObjectBean> (list, "getName", adapter);
Điều duy nhất còn thiếu bây giờ, là ghi đè phương thức "getFilter" trong lớp bộ điều hợp:
@Override public Filter getFilter () {
return MyViewClass.this.mFilter;
}
Tất cả đã được làm xong! Bạn sẽ lọc thành công danh sách của mình - Tất nhiên, bạn cũng nên triển khai thuật toán lọc theo cách tốt nhất mô tả nhu cầu của bạn, đoạn mã dưới đây chỉ là một ví dụ. . Hy vọng nó sẽ giúp, hãy cẩn thận.