package mcxtzhang.searchdemo;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Filter;
import android.widget.Filterable;
import java.util.ArrayList;
import java.util.List;
import mcxtzhang.searchdemo.abslistview.CommonAdapter;
public abstract class JokeFillterAdapter extends CommonAdapter<TestBean> implements Filterable {
private List<TestBean> mCppyDatas;
private static final String TAG = "TEST_SEARCH";
private MyFilter mFilter;
public JokeFillterAdapter(Context context, int layoutId, List<TestBean> datas) {
super(context, layoutId, datas);
mCppyDatas = datas; // 备份数据
}
//当ListView调用setTextFilter()方法的时候,便会调用该方法
@Override
public Filter getFilter() {
if (mFilter ==null){
mFilter = new MyFilter();
}
return mFilter;
}
//我们需要定义一个过滤器的类来定义过滤规则
/**
* 自定义 Filter类
*
* 两个方法:
* performFiltering 定义搜索规则。
* publishResults 对搜索结果的处理
*/
class MyFilter extends Filter{
//我们在performFiltering(CharSequence charSequence)这个方法中定义过滤规则
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults result = new FilterResults();
List<TestBean> tempList ; // temp中间集合
if (TextUtils.isEmpty(charSequence)){//当过滤的关键字为空的时候,我们则显示所有的数据
tempList = mCppyDatas;
}else {//否则把符合条件的数据对象添加到集合中
tempList = new ArrayList<>();
for (TestBean recomend:mCppyDatas){
if (recomend.getName().contains(charSequence)||recomend.getUrl().contains(charSequence)){
Log.d(TAG,"performFiltering:"+recomend.toString());
tempList.add(recomend);
}
}
}
result.values = tempList; //符合搜索的结果的数据集合
result.count = tempList.size();//符合搜索的结果的数据个数
return result;
}
//在publishResults方法中告诉适配器更新界面
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mDatas = (ArrayList<TestBean>)filterResults.values;
Log.d(TAG,"publishResults:"+filterResults.count);
if (filterResults.count>0){
notifyDataSetChanged();//通知数据发生了改变
Log.d(TAG,"publishResults:notifyDataSetChanged");
}else {
notifyDataSetInvalidated();//通知数据失效
Log.d(TAG,"publishResults:notifyDataSetInvalidated");
}
}
}
}