RecyclerView适配器notifyDataSetChanged无法正常工作

时间:2014-12-30 23:32:39

标签: android android-adapter android-recyclerview notifydatasetchanged

我延长了

RecyclerView.Adapter<RecyclerView.ViewHolder>

当我打电话时:

mRecyclerView.getAdapter().notifyDataSetChanged();

什么都没发生。

刷新视图的唯一方法是再次设置适配器(see this answer):

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

我对此解决方案有两个问题:

  1. 当我再次设置适配器时,我可以看到屏幕上闪烁
  2. 列表视图返回第一个位置。
  3. 有什么想法吗?

8 个答案:

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

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

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

    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。