Android RecyclerView添加搜索过滤器的示例代码
发布时间:2020-12-15 01:05:14 所属栏目:C语言 来源:网络整理
导读:搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的。下面给大家提供一种过滤列表的方法。 老规矩,先上图 RecycleView搜索过滤器-getFilter() Android 提供了Fileterable类,可以通过过滤器(条件)来过滤数据。通常,getFilter()方法必须在提供
搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的。下面给大家提供一种过滤列表的方法。 老规矩,先上图 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 i2) { adapter.getFilter().filter(sequence.toString()); } @Override public void afterTextChanged(Editable editable) { } }); 好了,到这里就结束了��。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |