首页 > 系统 > Android > 正文

Android RecyclerView添加搜索过滤器的示例代码

2019-10-22 18:16:55
字体:
来源:转载
供稿:网友

搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的。下面给大家提供一种过滤列表的方法。

老规矩,先上图

Android,添加搜索过滤器,搜索过滤器,RecyclerView

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) {   }  });

好了,到这里就结束了��。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表