繁体   English   中英

RecyclerView适配器notifyDataSetChanged不起作用

[英]RecyclerView Adapter notifyDataSetChanged not working

我延长了

RecyclerView.Adapter<RecyclerView.ViewHolder>

当我打电话时:

mRecyclerView.getAdapter().notifyDataSetChanged();

没啥事儿。

刷新视图的唯一方法是再次设置适配器( 请参见此答案 ):

mRecyclerView.setAdapter(new MyAdapter(...));

这个解决方案有两个问题:

  1. 再次设置适配器时,我可以在屏幕上看到闪烁的光
  2. 列表视图返回到第一个位置。

有任何想法吗?

如果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,我们可以执行以下操作:

  1. 再次创建并设置适配器:

     adapter=new MyAdapter(...); mRecyclerView.setAdapter(adapter); 
  2. 清除模型列表数据,然后通知:

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM