Адаптер RecyclerView notifyDataSetChanged не работает
Я расширил
RecyclerView.Adapter<RecyclerView.ViewHolder>
И когда я позвонил:
mRecyclerView.getAdapter().notifyDataSetChanged();
Ничего не случилось.
Единственный способ обновить представление - снова установить адаптер (см. этот ответ):
mRecyclerView.setAdapter(new MyAdapter(...));
У меня есть два вопроса с этим решением:
- Я вижу мигание на экране, когда я снова устанавливаю адаптер
- Список просмотров возвращается в первую позицию.
Любые идеи?
Ответы
Ответ 1
Если notifyDataSetChanged()
не вызывает обновления представлений, есть вероятность, что вы забыли вызвать SetLayoutManager()
для вашего RecyclerView (как я это сделал!). Только не забудьте сделать это: Java code:
LinearLayoutManager layoutManager = new LinearLayoutManager(context ,LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager)
Код С#, я использую Xamarin.
var layoutManager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false);
recyclerView.SetLayoutManager(layoutManager);
перед вызовом recyclerView.SetAdapter(adapter)
;
Ответ 2
Если ваш getItemCount()
возвращает 0, то notifyDataSetChanged()
ничего не сделает. Убедитесь, что при инициализации адаптера вы передаете действительный набор данных.
Ответ 3
В соответствии с javadocs: Если вы пишете адаптер, всегда будет более эффективно использовать более конкретные события изменений, если сможете. Положитесь на notifyDataSetChanged()
в крайнем случае.
public class NewsAdapter extends RecyclerView.Adapter<...> {
private static List mFeedsList;
...
public void swap(List list){
if (mFeedsList != null) {
mFeedsList.clear();
mFeedsList.addAll(list);
}
else {
mFeedsList = list;
}
notifyDataSetChanged();
}
Я использую Retrofit для извлечения списка, при использовании Retrofit onResponse(),
adapter.swap(feedList);
Ответ 4
Чтобы обновить переработчик, мы можем сделать следующее:
-
Создайте и настройте адаптер снова:
adapter=new MyAdapter(...);
mRecyclerView.setAdapter(adapter);
-
Очистите данные списка моделей и затем сообщите:
List<YourModel> tempModel=new ArrayList<>(modelList);
modelList.clear();
modelList.addAll(tempModel);
adapter.notifyDataSetChanged();
Ответ 5
Хотите поделиться чем-то, я столкнулся с той же проблемой. Но то, что я делал неправильно, было.
Я создавал экземпляр адаптера каждый раз, когда был новым, и не делал notifysetDatachange() для этого нового экземпляра, а не более старого.
Итак, убедитесь, что Adapter, которого вы notifysetDatachange(), должен быть старше.
Надежда ниже примера помогает..
MyAdapter mAdapter = new MyAdapter(...)
mRecyclerView.setAdapter(mAdapter );
// TODO
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();
MyAdapter extends baseAdapter {
MyAdapter () {
}
modifyData(String[] listData) {
}
}
Ответ 6
Итак, я исправил свою проблему следующим образом: orderList - это список, который я передаю в просмотр. Мы можем просто добавить элемент в позицию в списке, здесь 0 - это 0-я позиция в списке. Затем вызовите adapter.notifyDataSetChanged(). Работает как шарм
1) orderList.add(0, String); 2) orderAdapter.notifyDataSetChanged();
Ответ 7
В моем случае ничего, кроме этого, не получилось. Когда пришло время обновить RecyclerView
, я сделал:
array = getNewItems(); // populates the list with new items
((MyAdapter) mAdapter).setValues(array); // pass the new list to adapter !!!
mAdapter.notifyDataSetChanged(); // tell the adapter a data set has changed
В MyAdapter
я установил сеттер для данных:
public void setValues(List<Item> items){
this.items = items;
}
Вот оно!
[Обратите внимание, что notifyDataSetChanged
не работает без установки новых значений для адаптера.]
Ответ 8
notifyDataSetChanged() sholud вызывается в основном потоке.