RecyclerView Adapter notifyDataSetChanged не работает
Я продлил
RecyclerView.Adapter<RecyclerView.ViewHolder>
И когда я позвонил:
mRecyclerView.getAdapter().notifyDataSetChanged();
Ничего не случилось.
Единственный способ обновить представление - снова установить адаптер ( см. Этот ответ):
mRecyclerView.setAdapter(new MyAdapter(...));
У меня есть две проблемы с этим решением:
- Я вижу мигание на экране при повторной установке адаптера
- Список возвращается на первую позицию.
Есть идеи?
7 ответов
Если notifyDataSetChanged()
не вызывает просмотр обновлений, чем есть вероятность того, что вы забыли позвонить SetLayoutManager()
на вашем RecyclerView (как я сделал!). Просто не забудьте сделать это:Java code:
LinearLayoutManager layoutManager = new LinearLayoutManager(context ,LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager)
C# код, я использую Xamarin.
var layoutManager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false);
recyclerView.SetLayoutManager(layoutManager);
прежде чем позвонить recyclerView.SetAdapter(adapter)
;
Если твой getItemCount()
возвращает 0, затем notifyDataSetChanged()
не буду ничего делать Убедитесь, что при инициализации адаптера вы передаете действительный набор данных.
Согласно 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);
Чтобы обновить переработчик, мы можем сделать следующее:
1. Create and set adapter again:
adapter=new MyAdapter(...);
mRecyclerView.setAdapter(adapter);
2. Clear model list data and then notify:
ArrayList<YourModel> tempModel=new ArrayList<>(modelList);
modelList.clear();
modelList.addAll(tempModel);
adapter.notifyDataSetChanged();
В моем случае ничего, кроме этого, не сработало. Когда пришло время обновить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
не работает без установки новых значений для адаптера.]
Итак, я исправил свою проблему следующим образом: orderList - это список, который я передаю в просмотр. Мы можем просто добавить элемент в позицию в списке, здесь 0 - это 0-я позиция в списке. Затем вызовите adapter.notifyDataSetChanged() . Работает как шарм
1) orderList.add (0, String); 2) orderAdapter.notifyDataSetChanged ();
Хотите поделиться чем-то, я столкнулся с той же проблемой. Но то, что я делал неправильно, было. Я каждый раз создавал экземпляр Adapter, а затем делал notifysetDatachange() для этого нового экземпляра, а не для более старого.
Поэтому, пожалуйста, убедитесь, что Adapter, о котором вы уведомляете setDatachange (), должен быть старше. Надеюсь приведенный ниже пример поможет..
MyAdapter mAdapter = new MyAdapter(...)
mRecyclerView.setAdapter(mAdapter );
// TODO
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();
MyAdapter extends baseAdapter {
MyAdapter () {
}
modifyData(String[] listData) {
}
}