過濾器接口ide
經過添加過濾條件,刷新符合條件的數據並顯示。在列表中,一般都是在適配器實現Filterable
接口,並重寫getFilter
方法。以下是getFilter
方法的一個案例code
@Override public Filter getFilter() { return new Filter() { //執行過濾,在這裏指明過濾條件 @Override protected FilterResults performFiltering(CharSequence constraint) { String filterStr = constraint.toString(); if (filterStr.isEmpty()) { mFilterBeans = mBeanList; } else { mFilterBeans.clear(); for (FilterBean bean : mBeanList) { //若是字符串是否以指定的前綴開始,那麼就是想要的結果 if (bean.getFood().startsWith(filterStr)) { mFilterBeans.add(bean); } } } FilterResults results = new FilterResults(); results.values = mFilterBeans; return results; } //發佈過濾後的結果 @Override protected void publishResults(CharSequence constraint, FilterResults results) { mFilterBeans = (ArrayList<FilterBean>) results.values; notifyDataSetChanged(); } }; }
在其適配器構造器中,有以下實現:orm
public FilterAdapter(Context context, List<FilterBean> beanList) { mContext = context; mBeanList = beanList;//原始數據 mFilterBeans = new ArrayList<>(beanList);//過濾源 }
整個過程要注意數據源和過濾後的源,他們最好不能是同一個,或者是同一個引用。在篩選過程當中,都是經過篩選數據源裏的數據,並一一添加進過濾數據源,保存最初的數據「範本」,才能在屢次篩選中獲得正確的沒有遺漏的數據。固然,在適配器中,在這裏展示的是過濾源的數據,因此在onBindViewHolder
和getItemCount
都是使用過濾源接口
@Override public int getItemCount() { return mFilterBeans != null ? mFilterBeans.size() : 0; }