我延长了
RecyclerView.Adapter<RecyclerView.ViewHolder>
当我打电话时:
mRecyclerView.getAdapter().notifyDataSetChanged();
什么都没发生。
刷新视图的唯一方法是再次设置适配器(see this answer):
mRecyclerView.setAdapter(new MyAdapter(...));
我对此解决方案有两个问题:
有什么想法吗?
答案 0 :(得分:25)
如果notifyDataSetChanged()
没有触发视图更新,那么您可能忘记在RecyclerView上调用SetLayoutManager()
(就像我做的那样!)。
别忘了这样做:
Java代码:
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)
;
答案 1 :(得分:23)
如果您的getItemCount()
返回0,则notifyDataSetChanged()
不会做任何事情。确保在初始化适配器时,您传递的是有效数据集。
答案 2 :(得分:4)
根据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);
答案 3 :(得分:2)
就我而言,什么都没有起作用。是时候刷新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
在不为适配器设置新值的情况下不起作用。]
答案 4 :(得分:1)
要更新recyclerview,我们可以执行以下操作:
再次创建和设置适配器:
adapter=new MyAdapter(...);
mRecyclerView.setAdapter(adapter);
清除模型列表数据,然后通知:
List<YourModel> tempModel=new ArrayList<>(modelList);
modelList.clear();
modelList.addAll(tempModel);
adapter.notifyDataSetChanged();
答案 5 :(得分:0)
想要分享一些东西,我遇到了同样的问题。但我做错了是。 我每次都在创建适配器实例,而不是对新实例执行notifysetDatachange()而不是旧实例。
因此,请确保您notifysetDatachange()的适配器应该更旧。 希望下面的例子可以帮助..
MyAdapter mAdapter = new MyAdapter(...)
mRecyclerView.setAdapter(mAdapter );
// TODO
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();
MyAdapter extends baseAdapter {
MyAdapter () {
}
modifyData(String[] listData) {
}
}
答案 6 :(得分:0)
所以我这样解决了我的问题:orderList是我传递给recyclerview的列表。我们可以将项目添加到列表中的位置,这里0是列表中的第0个位置。然后调用adapter.notifyDataSetChanged()。像魅力一样工作
1)orderList.add(0,String); 2)orderAdapter.notifyDataSetChanged();
答案 7 :(得分:-2)
notifyDataSetChanged()在主线程中调用sholud。