![](/img/trans.png)
[英]notifyDataSetChanged() not working on custom RecyclerView adapter
[英]RecyclerView Adapter notifyDataSetChanged not working
我延长了
RecyclerView.Adapter<RecyclerView.ViewHolder>
当我打电话时:
mRecyclerView.getAdapter().notifyDataSetChanged();
没啥事儿。
刷新视图的唯一方法是再次设置适配器( 请参见此答案 ):
mRecyclerView.setAdapter(new MyAdapter(...));
这个解决方案有两个问题:
有任何想法吗?
如果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)
;
如果您的getItemCount()
返回0,则notifyDataSetChanged()
将不执行任何操作。 确保在初始化适配器时传递有效的数据集。
根据javadocs:如果您正在编写适配器,那么如果可以的话,使用更具体的更改事件将总是更加高效。 notifyDataSetChanged()
不得已时,请依赖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);
要更新recyclerview,我们可以执行以下操作:
再次创建并设置适配器:
adapter=new MyAdapter(...); mRecyclerView.setAdapter(adapter);
清除模型列表数据,然后通知:
List<YourModel> tempModel=new ArrayList<>(modelList); modelList.clear(); modelList.addAll(tempModel); adapter.notifyDataSetChanged();
想分享一些东西,我面临着同样的问题。 但是我做错了。 我每次都创建Adapter实例,而不是对那个新实例而不是较旧的实例做notifysetDatachange()。
因此,请确保您要通知谁的AdaptersetDataData()应该较旧。 希望下面的例子有帮助。
MyAdapter mAdapter = new MyAdapter(...)
mRecyclerView.setAdapter(mAdapter );
// TODO
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();
MyAdapter extends baseAdapter {
MyAdapter () {
}
modifyData(String[] listData) {
}
}
所以我解决了这样的问题:orderList是我传递给recyclerview的列表。 我们可以将项目添加到列表中的位置,这里0是列表中的第0个位置。 然后调用adapter.notifyDataSetChanged()。 奇迹般有效
1)orderList.add(0,String); 2)orderAdapter.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
,我将setter放入了数据中:
public void setValues(List<Item> items){
this.items = items;
}
而已!
[ 请注意 ,在没有为适配器设置新值的情况下notifyDataSetChanged
无效。
应该在主线程中调用notifyDataSetChanged()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.