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

作者:人言落日是天涯 时间:2022-03-08 21:44:49 

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

老规矩,先上图

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

}
 });

来源:https://www.jianshu.com/p/04a2e42a732e

标签:Android,搜索,过滤器
0
投稿

猜你喜欢

  • java实习--每天打卡十道面试题!

    2021-12-06 15:22:19
  • Spring gateway + Oauth2实现单点登录及详细配置

    2022-12-19 00:16:49
  • 通过Java实现文件断点续传功能

    2022-06-22 16:30:42
  • base64_encode和base64_decode的JAVA实现

    2023-08-25 07:56:49
  • Mybatis RowBounds 限制查询条数的实现代码

    2022-11-18 17:26:03
  • Java 容器类源码详解 Set

    2022-03-21 18:08:40
  • Mybatis插件之自动生成不使用默认的驼峰式操作

    2023-11-19 01:20:03
  • C#实现动态执行字符串脚本(优化版)的示例代码

    2022-06-10 19:13:54
  • C#创建Excel多级分组的方法

    2022-03-21 15:20:34
  • 详解springboot之jackson的两种配置方式

    2021-11-03 11:01:21
  • Java实现将类数据逐行写入CSV文件的方法详解

    2023-02-27 17:11:11
  • SpringBoot登录验证码实现过程详解

    2023-04-26 12:24:05
  • 解析spring cloud ouath2中的Eureka

    2023-10-12 04:07:54
  • java实现图片分割指定大小

    2021-07-02 16:56:34
  • 解决spring mvc 多数据源切换,不支持事务控制的问题

    2022-09-30 03:39:56
  • cmd中javac和java使用及注意事项详解

    2022-03-25 10:37:36
  • Unity3D动态对象优化代码分享

    2023-12-22 09:38:24
  • java selenium元素定位大全

    2023-10-23 01:07:42
  • Android可筛选的弹窗控件CustomFiltControl

    2023-01-21 09:01:46
  • Java动态规划之硬币找零问题实现代码

    2023-01-23 20:37:38
  • asp之家 软件编程 m.aspxhome.com