Добавить фильтр в SearchView с комнатой и RecyleView - PullRequest
0 голосов
/ 07 ноября 2018

(гугл переводчик)

Введение Я искал это решение, но не нашел его. Если есть дубликат этой проблемы, пожалуйста, дайте мне знать. спасибо.

Проблема: Я создал приложение для хранения с базой данных Room и RecycleView. Затем я искал способы добавить Поиск к моим данным. Все прошло гладко, но была одна проблема. Если искомое слово сокращено, тогда поиск ограничен видимыми данными. (Посмотрите на скриншот)

  1. Нормальный
  2. Поиск выполнен (Обычный)
  3. Пустое слово
  4. Поиск снова и результат
  5. GIF-изображение

Надеюсь, вы понимаете. Пожалуйста, помогите мне. Я видел много уроков, но ничего не работает.

спасибо

Мой код: Фильтр в моем адаптере

public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                List<Barang> filteredList = new ArrayList<>();
                if (charString.isEmpty()) {
                    filteredList.addAll(namaBarang);
                } else {
                    for (Barang row : namaBarang) {

                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getNamaBarang().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(row);
                        }
                    }

                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = filteredList;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                namaBarang = (ArrayList<Barang>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

MainActivity

   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        final MenuItem searchItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setOnQueryTextListener(this);
        return true;
    }

        @Override
        public boolean onQueryTextSubmit(String query) {
            adapter.getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
         //   t = newText.;

            adapter.getFilter().filter(newText);
            return false;
        }

И у меня это тоже есть в моем адаптере:

void setBarangs(List<Barang> barangs){
    namaBarang = barangs;
    notifyDataSetChanged();
}

1 Ответ

0 голосов
/ 08 ноября 2018

Моя проблема была решена с помощью:

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            List<Barang> listHasilFilter = new ArrayList<>();
            List<Barang> listYgAkandiFilter = new ArrayList<>();
            listYgAkandiFilter.addAll(namaBarangC);
            if (charString.isEmpty()) {
                listHasilFilter = listYgAkandiFilter;

            //    namaBarang = listYgAkandiFilter;
                Log.d(TAG, "" + namaBarang.size());
            } else {
                for (Barang row : namaBarangC) {

                    // name match condition. this might differ depending on your requirement
                    // here we are looking for name or phone number match
                    if (row.getNamaBarang().toLowerCase().contains(charString.toLowerCase())) {
                        listHasilFilter.add(row);
                    }
                }

            }

            FilterResults hasilFilter = new FilterResults();
            hasilFilter.values = listHasilFilter;
            return hasilFilter;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults hasilFilter) {
            namaBarang = (ArrayList<Barang>) hasilFilter.values;
            notifyDataSetChanged();
        }
    };
}

Спасибо

...