यदि कोई इस विषय में अभी भी रुचि रखता है, तो मुझे लगता है कि फ़िल्टरिंग सूचियों के लिए सबसे अच्छा तरीका एक सामान्य फ़िल्टर वर्ग बनाना है और जावा पुराने स्कूल एसडीके पैकेज में निहित कुछ आधार प्रतिबिंब / जेनेरिक तकनीकों के साथ इसका उपयोग करना है। यहाँ मैंने क्या किया है:
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;
}
और बाद में, केवल एक चीज जो आपको करने की ज़रूरत है वह है फिल्टर को एक सदस्य वर्ग के रूप में बनाना (संभवतः दृश्य के "ऑनक्रिएट" के भीतर) अपने एडेप्टर संदर्भ, आपकी सूची और फ़िल्टरिंग के लिए बुलाया जाने वाला तरीका:
this.mFilter = new GenericFilter<MyObjectBean> (list, "getName", adapter);
केवल एक चीज अब गायब है, एडेप्टर वर्ग में "getFilter" विधि को ओवरराइड करना है:
@Override public Filter getFilter () {
return MyViewClass.this.mFilter;
}
सब कुछ कर दिया! आपको अपनी सूची को सफलतापूर्वक फ़िल्टर करना चाहिए - निश्चित रूप से, आपको अपने फ़िल्टर एल्गोरिथ्म को अपनी आवश्यकता का वर्णन करने का सबसे अच्छा तरीका लागू करना चाहिए, कोड बोलो केवल एक उदाहरण है। । आशा है कि यह मदद की, ध्यान रखना।