搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的。下面给大家提供一种过滤列表的方法。
老规矩,先上图
RecycleView搜索过滤器-getFilter()
Android 提供了Fileterable类,可以通过过滤器(条件)来过滤数据。通常,getFilter()方法必须在提供过滤条件的适配器类中被重写,以通过列表进行搜索。下面是通过getFilter(),来过滤数据。
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilterList = mSourceList;
} else {
List<String> filteredList = new ArrayList<>();
for (String str : mSourceList) {
//这里根据需求,添加匹配规则
if (str.contains(charString)) {
filteredList.add(str);
}
}
mFilterList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilterList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilterList = (ArrayList<String>) filterResults.values;
//刷新数据
notifyDataSetChanged();
}
};
}
完整Adapter代码:
//这里实现Filterable接口
class TitleAdapter extends RecyclerView.Adapter<TitleAdapter.TitleHolder> implements Filterable {
private List<String> mSourceList = new ArrayList<>();
private List<String> mFilterList = new ArrayList<>();
private void appendList(List<String> list) {
mSourceList = list;
//这里需要初始化filterList
mFilterList = list;
}
@Override
public TitleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new TitleHolder(LayoutInflater.from(FastScrollRecyclerActivity.this).inflate(R.layout.item_textview_view, parent, false));
}
@Override
public void onBindViewHolder(TitleHolder holder, int position) {
//这里也是过滤后的list
holder.tv.setText(mFilterList.get(position));
}
@Override
public int getItemCount() {
//注意这里需要是过滤后的list
return mFilterList.size();
}
//重写getFilter()方法
@Override
public Filter getFilter() {
return new Filter() {
//执行过滤操作
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
//没有过滤的内容,则使用源数据
mFilterList = mSourceList;
} else {
List<String> filteredList = new ArrayList<>();
for (String str : mSourceList) {
//这里根据需求,添加匹配规则
if (str.contains(charString)) {
filteredList.add(str);
}
}
mFilterList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilterList;
return filterResults;
}
//把过滤后的值返回出来
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilterList = (ArrayList<String>) filterResults.values;
notifyDataSetChanged();
}
};
}
class TitleHolder extends RecyclerView.ViewHolder {
TextView tv;
public TitleHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.id_tv_test);
}
}
}
数据初始化部分
private String[] str = new String[]{
"apple", "apple juice", "apple pie", "abalone", "bread", "brandy", "Blueberry", "Banana", "chocolate", "cake", "chicken", "cheese", "Durian",
"Dim Sam", "Dumpling", "duck", "egg", "English muffin", "eggplant", "French toast", "fish", "fig", "fruit"
};
private List<String> mList = new ArrayList<>();
private void initList() {
for (int i = 0; i < str.length; i++) {
mList.add(str[i]);
}
}
设置RecycleView和EditText监听
RecyclerView rv = (RecyclerView) findViewById(R.id.id_rv);
LinearLayoutManager manager = new LinearLayoutManager(this);
rv.setLayoutManager(manager);
final TitleAdapter adapter = new TitleAdapter();
adapter.appendList(mList);
rv.setAdapter(adapter);
EditText et = findViewById(R.id.id_et);
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence sequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence sequence, int i, int i1, int i2) {
adapter.getFilter().filter(sequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
好了,到这里就结束了🙂。