Android - 实现搜索过滤器到RecyclerView [英] Android - Implementing search filter to a RecyclerView

查看:374
本文介绍了Android - 实现搜索过滤器到RecyclerView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要实现一个基于EditText的搜索功能,我的RecyclerView列表必须被滤除,而typng



这里的代码是:



DisplayAdapter.java 这是适配器

  public class DisplayAdapter extends RecyclerView.Adapter< DisplayAdapter.MyViewHolder> {
private List< DataHolder> displayedList;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView english_d;
public MyViewHolder(View view){
super(view);
english_d =(TextView)view.findViewById(R.id.engword);

$ b public DisplayAdapter(List< DataHolder> displayedList){
this.displayedList = displayedList;

$ b @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,int position){
//创建布局
查看itemView = LayoutInflater.from( parent.getContext())。inflate(R.layout.list_item,parent,false);

返回新的MyViewHolder(itemView);

@Override
public void onBindViewHolder(MyViewHolder holder,int position){
DataHolder content = displayedList.get(position);
holder.english_d.setText(content.getEnglish());

@Override
public int getItemCount(){
return displayedList.size();




$ p DataHolder.java / p>

  public class DataHolder {
private String english;

$ b public DataHolder(){
}

public DataHolder(String english,String norse){
this.english = english;



public String getEnglish(){
return english;
}

public void setEnglish(String english){
this.english = english;


$ b $ / code $ / pre

这里是我的片段使用:

  @Override 
public View onCreateView(LayoutInflater inflater,ViewGroup容器,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_two_fragment,container,false);

rv =(RecyclerView)view.findViewById(R.id.list_view_english);
rv.setHasFixedSize(true);

inputSearch =(EditText)view.findViewById(R.id.inputSearch);

rv.addItemDecoration(new DividerItemDecoration(getActivity(),LinearLayoutManager.VERTICAL));
final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false);
rv.setLayoutManager(layoutManager);


DisplayContent();


disp_adapter = new DisplayAdapter(displayedList);

rv.setAdapter(disp_adapter);
返回视图;


解决方案

用于更新列表

  public void updateList(List< DataHolder> list){
displayedList = list;
notifyDataSetChanged();



$ b $ p
$ b

添加用于搜索的textWatcher可以让您使用Edittext作为搜索字段

  searchField.addTextChangedListener(new TextWatcher(){
@Override $ b $ public void onTextChanged(CharSequence s,int start, int before,int count){

// TODO自动生成方法存根

$ b @Override
public void beforeTextChanged(CharSequence s,int int count,int after){

// TODO自动生成的方法存根
}

@Override
public void afterTextChanged(Editable s ){

//从输入
过滤你的列表(s.toString());
//你可以使用可运行的postDelayed,比如500毫秒来延迟搜索文本
}
});


void filter(String text){
List< DataHolder> temp = new ArrayList();
for(DataHolder d:displayedList){
//或者使用.equal(text)与你想要的匹配
//使用.toLowerCase()获得更好的匹配
if( d.getEnglish()。contains(text)){
temp.add(d);


//更新recyclerview
disp_adapter.updateList(temp);
}


I need to implement a search feature based on an EditText to my RecyclerView the list must be filtered while typng

Here's the code :

DisplayAdapter.java this is the adapter

public class DisplayAdapter extends RecyclerView.Adapter<DisplayAdapter.MyViewHolder>{
    private List<DataHolder> displayedList;
    public class MyViewHolder extends RecyclerView.ViewHolder{
        public TextView english_d;
        public MyViewHolder(View view){
              super(view);
              english_d = (TextView) view.findViewById(R.id.engword);
        }
   }
    public DisplayAdapter(List<DataHolder> displayedList){
        this.displayedList = displayedList;
      }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int position)    {
    // create a layout
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);

    return new  MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    DataHolder content = displayedList.get(position);
    holder.english_d.setText(content.getEnglish());
   }
@Override
public int getItemCount() {
    return displayedList.size();
   }
}

DataHolder.java

public class DataHolder {
private String english;


public DataHolder() {
}

public DataHolder(String english, String norse) {
    this.english = english;

}

public String getEnglish() {
    return english;
}

public void setEnglish(String english) {
    this.english = english;
   }

}

and here's the Fragment that I am working with :

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_two_fragment, container, false);

        rv = (RecyclerView) view.findViewById(R.id.list_view_english);
        rv.setHasFixedSize(true);

        inputSearch = (EditText) view.findViewById(R.id.inputSearch);

        rv.addItemDecoration(new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL));
        final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        rv.setLayoutManager(layoutManager);


        DisplayContent();


        disp_adapter = new DisplayAdapter(displayedList);

        rv.setAdapter(disp_adapter);
   return view;
}

解决方案

in your adapter add new function for update the list

public void updateList(List<DataHolder> list){
     displayedList = list;
     notifyDataSetChanged();
}

add textWatcher for search lets say you are using Edittext as search field

searchField.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            // TODO Auto-generated method stub
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            // TODO Auto-generated method stub
        }

        @Override
        public void afterTextChanged(Editable s) {

            // filter your list from your input
            filter(s.toString());
            //you can use runnable postDelayed like 500 ms to delay search text
        }
    });


void filter(String text){
     List<DataHolder> temp = new ArrayList();
     for(DataHolder d: displayedList){
           //or use .equal(text) with you want equal match
           //use .toLowerCase() for better matches
           if(d.getEnglish().contains(text)){
               temp.add(d);
           }
     }
     //update recyclerview
     disp_adapter.updateList(temp);
}

这篇关于Android - 实现搜索过滤器到RecyclerView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆