Android - 为 RecyclerView 实现搜索过滤器

新手上路,请多包涵

我需要实现基于 EditText 到我的 RecyclerView 的搜索功能。键入时必须过滤列表。

这是代码:

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

数据持有者.java

 public class DataHolder {
private String english;

public DataHolder() {
}

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

}

public String getEnglish() {
    return english;
}

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

}

这是我正在使用的片段:

 @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;
}

原文由 Thorvald 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

在您的适配器中添加新功能以更新列表

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

为搜索添加 textWatcher 假设您使用 Edittext 作为搜索字段

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

黄油刀

@OnTextChanged(R.id.feature_manager_search)
protected void onTextChanged(CharSequence text) {
    filter(text.toString());
}

原文由 ZeroOne 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 Kotlin 在 Android 中搜索 RecyclerView 过滤器:-

        fun addTextListener() {
            ed_general.addTextChangedListener(object : TextWatcher {
                override fun afterTextChanged(s: Editable) {}
                override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
                override fun onTextChanged(query1: CharSequence, start: Int, before: Int, count: Int) {
                    var query = query1
                    query = query.toString().toUpperCase()
                    val filteredList: ArrayList<GetFavoritePojo.Data> = ArrayList()
                    for (i in 0 until arrayList.size) {
                        val text: String = arrayList.get(i).name.toUpperCase()
                        if (text.contains(query)) {
                            filteredList.add(arrayList.get(i))
                        }
                    }
                    editProfileFavoriteAdapter = EditProfileFavoriteAdapter(
                        requireActivity(),
                        filteredList)
                    recycler_fav.setAdapter(editProfileFavoriteAdapter)
                    editProfileFavoriteAdapter!!.notifyDataSetChanged() // data set changed
                }
            })
        }

在 XML 中使用此 Edittext :-

  <EditText
            android:id="@+id/ed_general"
            style="@style/edittext_style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_16sdp"
            android:background="@drawable/button_white_rounded_corners"
            android:drawableLeft="@drawable/ic_search"
            android:fontFamily="@font/balsamiq_sans_regular"
            android:hint="Search Here..."
            android:textSize="@dimen/_12sdp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/view_1" />

原文由 Safal Bhatia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题