Фильтр Android recyclerview не показывает никаких элементов, пока не будет щелкнуть значок searchview

У меня есть фрагмент, в котором я выполняю сетевой вызов и заполняю содержащееся в нем представление ресайклера карточками. Теперь я выполнил this, чтобы добавить фильтр в свое представление ресайклера. Теперь проблема возникает, когда в конструкторе адаптера я делаю

this.storeLists = new ArrayList<>(storeLists);

Список в моем фрагменте заполняется, но не отображает никаких элементов, пока я не щелкну значок searchview и не начну что-то вводить. После этого, даже если я закрою окно поиска, список сохранится.

Я попытался изменить строку выше на

this.storeLists = storeLists;

когда я удаляю поисковый запрос, удаленные элементы не отображаются. Так что в случае, если я ищу что-то несуществующее в моем списке представлений ресайклера, у меня ничего не отображается в моем представлении ресайклера.

Я хочу, чтобы когда я открываю фрагмент, я вижу результат, а затем, когда я нажимаю значок поиска и начинаю вводить, фильтры работают, как показано в приведенной выше ссылке.

ИЗМЕНИТЬ:

Здесь - это мой адаптер, а здесь мой вызывающий фрагмент.


person Ayush Pahwa    schedule 08.03.2016    source источник
comment
Я могу понять, в чем ваша проблема, и сталкиваюсь с той же проблемой. Если вы покажете мне свой код, мне будет легче определить проблему   -  person Ragesh Ramesh    schedule 08.03.2016
comment
@RageshRamesh отредактировал и добавил код.   -  person Ayush Pahwa    schedule 08.03.2016


Ответы (2)


Вы используете this.storeLists = new ArrayList ‹> (storeLists); и, следовательно, notifyDatasetChanged не будет работать, поскольку вы вообще используете новый список.

Но вы не должны изменять его, так как вам нужно сохранить storeLists, поскольку он содержит ваши полные данные. Что вы можете сделать, так это создать метод, как показано ниже, в вашем адаптере

 public void setList(ArrayList<StoreList> mList){
   this.storeList = mList;
   notifyDataSetChanged();
 }

И в вашем фрагменте после того, как вы загрузили данные и добавили в свой список хранилищ, вызовите метод setList следующим образом

 mAdapter.setList(storeList);

также удалите mAdapter.notifyDataSetChanged () в вашем методе storeReq, поскольку он ничего не делает.

person Ragesh Ramesh    schedule 08.03.2016
comment
Проблема сохраняется, поскольку я установил список в adapter = mList, что удаление элементов не вернет ранее исключенные элементы. См. Здесь stackoverflow.com/questions/34841163/ - person Ayush Pahwa; 08.03.2016

После некоторых проб и попыток я нашел решение ценой крутой анимации. На данный момент сегмент кода работает, просто перезагружая адаптер следующим образом:

@Override
public boolean onQueryTextChange(String newText) {
    Log.d(TAG,newText);
    searchStoreList = storeList;
    final List<StoreList> filteredModelList = filter(searchStoreList, newText);
    //((RVStoreAdapter) mAdapter).animateTo(filteredModelList);
    //The above commented line is the old code. Following is how to reset the adapter!
    mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new RVStoreAdapter(getActivity(),storeList,session.getLat(),session.getLongi());
    mRecyclerView.setAdapter(mAdapter);
    mRecyclerView.scrollToPosition(0);
    return true;
}

Анимация теперь очень резкая, но решение сбрасывает список при соответствующем изменении поискового запроса.

person Ayush Pahwa    schedule 13.03.2016