列表视图过滤器Android我已经在android中创建了一个列表视图,我希望在列表的上方添加编辑文本,当用户输入文本时,列表将根据用户输入进行筛选。如果有一种方法可以过滤Android中的列表适配器,谁能告诉我吗?
3 回答
![?](http://img1.sycdn.imooc.com/545868c20001b8c402200220-100-100.jpg)
倚天杖
TA贡献1828条经验 获得超3个赞
public class vJournalAdapter extends ArrayAdapter<JournalModel> implements Filterable{private ArrayList<JournalModel> items;private Context mContext;....
private class JournalFilter extends Filter{ @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults result = new FilterResults(); List<JournalModel> allJournals = getAllJournals(); if(constraint == null || constraint.length() == 0){ result.values = allJournals; result.count = allJournals.size(); }else{ ArrayList<JournalModel> filteredList = new ArrayList<JournalModel>(); for(JournalModel j: allJournals){ if(j.source.title.contains(constraint)) filteredList.add(j); } result.values = filteredList; result.count = filteredList.size(); } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results.count == 0) { notifyDataSetInvalidated(); } else { items = (ArrayList<JournalModel>) results.values; notifyDataSetChanged(); } }}
![?](http://img1.sycdn.imooc.com/54584ef20001deba02200220-100-100.jpg)
鸿蒙传说
TA贡献1865条经验 获得超7个赞
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);
@Override public Filter getFilter () { return MyViewClass.this.mFilter;}
- 3 回答
- 0 关注
- 433 浏览
添加回答
举报
0/150
提交
取消