Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Cách để filter RecyclerView với SearchView ạ ??

8 năm trước 1.308 lượt xem 1 bình luận 8 năm trước

Em có cái Adapter thế này ạ 

Em có 1 Fragment chứa RecyclerView và cái SearchView như thế này :

Cái Array List thì em sẽ set bên MainActivity ạ. Trong cái Adapter em có cái hàm lọc từ cái String rồi kết thúc hàm thì nó gọi NotifyDataSetChanged(). Rồi em gọi cái hàm lọc để bên OnQueryTextChanged bên fragment để khi nó thay đổi chữ bên đó thì nó sẽ lọc.

Cơ mà nó vẫn không lọc được, ghi chữ gì lên nó xóa hêt cái RecyclerView. Em tìm kiếm trên mạng quài mà vẫn không biết cách xử lý làm sao. Em đang tính bỏ SearchView xong chuyển qua EditText nào đó mà không biết có khác gì nhau không ??

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Hậu Đỗ đã bình luận 8 năm trước

Bạn có thể làm như sau (dùng để lọc data cho fragment chứa recyclerview, bạn có thể dùng ý tưởng này để dùng cho trường hợp của bạn). Đây là cách mình hay dùng, hy vọng nó giúp đc bạn...

1/.Đầu tiên bên adapter recycler view bạn định nghĩa một hàm lọc data:

public void setFilter(List<Model> models){
        listModels= new ArrayList<>();
        listModels.addAll(models);
        notifyDataSetChanged();
    }

2/. Trong hàm onCreateOptionsMenu bên fragment:

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_main, menu);

        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);

        MenuItemCompat.setOnActionExpandListener(item,
                new MenuItemCompat.OnActionExpandListener() {
                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem item) {
                        adapter.setFilter(listModel);
                        return true;
                    }

                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
                        return true; 
                    }
                });
    }

3/. Định nghĩa thêm một hàm trong fragment:

private List<Model> filter(List<Model> models, String query) {
        query = query.toLowerCase();

        final List<Model> filteredModelList = new ArrayList<>();
        for (Model model : models) {
            final String text = model.getName().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }
        }
        return filteredModelList;
    }

4/. Trong onQueryTextChange:

@Override
    public boolean onQueryTextChange(String newText) {
        final List<CountryModel> filteredModelList = filter(listModel, newText);
        adapter.setFilter(filteredModelList);
        return true;
    }

 

Bài viết
2
Câu hỏi
4
Bình luận
7