19

我伸出RecyclerView適配器notifyDataSetChanged不工作

RecyclerView.Adapter<RecyclerView.ViewHolder> 

當我打電話:

mRecyclerView.getAdapter().notifyDataSetChanged(); 

什麼也沒發生。

刷新視圖的唯一方法是重新設置適配器(see this answer):

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

我有兩個問題,這種解決方案:

  1. 我可以在屏幕上看到一個閃爍當我再次設置適配器
  2. 列表視圖返回到第一位置。

任何想法?

+0

你試過封裝notifyDataSetChanged方法MyAdapter?例如:在MyAdapter中創建「myNotifyDataSetChanged」,並從該方法調用this.notifyDataSetChanged()「。保存MyAdapter引用並調用myAdapterRef.myNotifyDataSetChanged()而不是myRecyiclerView.getAdapter()。notifyDataSetChanged()。不知道爲什麼它爲我工作(我有ListView的問題) – bajicdusko

+0

@helionprime沒有幫助:( – David

+0

好吧,我的壞。我忘了獲取/使用'onBindViewHolder'方法中更新的數據。眨眼效果,我怎麼能擺脫它? – David

回答

17

如果您getItemCount()返回0,那麼notifyDataSetChanged()不會做任何事情。確保在初始化適配器時傳遞有效的數據集。

4

根據的javadoc:如果你正在編寫一個適配器,它總是會更有效,如果你能使用更具體的變更事件。依靠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(); 
} 

我使用的改造來獲取列表中,改造的onResponse()使用,

adapter.swap(feedList); 
+0

「根據javadocs:如果您正在編寫適配器,如果您可以」在javadocs中您找到此信息的位置?「,使用更具體的更改事件將始終更高效。 –

+0

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged() –

13

如果notifyDataSetChanged()不會觸發視圖更新比還有就是你忘記打電話SetLayoutManager()一個機會你的RecyclerView(就像我做的一樣!)。 只是不要忘記這樣做:

var manager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false); 
_list.SetLayoutManager(manager); 

你叫SetAdapter()前;

對不起,C#代碼,我使用Xamarin。

0

想分享一些東西,我面臨同樣的問題。但是我做錯了什麼。 我每次創建適配器的實例新比做notifysetDatachange()到新實例不舊的一個。

所以請確保適配器就是你notifysetDatachange()應該是老年人之一。 希望下面的例子可以幫助..

 MyAdapter mAdapter = new MyAdapter(...) 

    mRecyclerView.setAdapter(mAdapter); 

// TODO 
mAdapter.modifyData(....); 
mAdapter.notifySetDataChange(); 


    MyAdapter extends baseAdapter { 
    MyAdapter() { 
    } 
    modifyData(String[] listData) { 

    } 

    } 
-4

notifyDataSetChanged()sholud在主線程中調用。

+0

這似乎不是問題所在 – Gabriel

0

要更新recyclerview我們可以做到以下幾點:

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(); 
相關問題