যদি কেউ এখনও এই বিষয়ে আগ্রহী হন তবে আমি দেখতে পেয়েছি যে ফিল্টারিং তালিকাগুলির জন্য সর্বোত্তম পন্থা হল জেনেরিক ফিল্টার ক্লাস তৈরি করা এবং জাভা পুরাতন স্কুল এসডিকে প্যাকেজে থাকা কিছু বেস প্রতিবিম্ব / জেনেরিক কৌশল সহ এটি ব্যবহার করা। আমি যা করেছি তা এখানে:
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;
}
এবং এর পরে, কেবলমাত্র আপনাকে যা করতে হবে তা হল আপনার ক্লাসিংয়ের জন্য অ্যাডাপ্টারের রেফারেন্স, আপনার তালিকা এবং পদ্ধতিটি আহ্বান করার পদ্ধতিটি সদস্য শ্রেণীর (সম্ভবত ভিউয়ের "অনক্রিয়েট" এর মধ্যে থাকা) হিসাবে ফিল্টার তৈরি করা:
this.mFilter = new GenericFilter<MyObjectBean> (list, "getName", adapter);
এখন কেবল অনুপস্থিত, অ্যাডাপ্টার শ্রেণিতে "getFilter" পদ্ধতিটি ওভাররাইড করা:
@Override public Filter getFilter () {
return MyViewClass.this.mFilter;
}
সব শেষ! আপনার সফলভাবে আপনার তালিকাটি ফিল্টার করা উচিত - অবশ্যই, আপনার ফিল্টার অ্যালগরিদমকেও আপনার প্রয়োজনকে বর্ণনা করার সেরা উপায়ে কার্যকর করা উচিত, কোড বেলো মাত্র একটি উদাহরণ। । আশা করি এটি সাহায্য করেছে, যত্ন নিন।