软件编程
位置:首页>> 软件编程>> Android编程>> Android RecyclerView添加搜索过滤器的示例代码

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

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

标签:Android,搜索,过滤器

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

老规矩,先上图

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com