2016-09-24 52 views
0

我有沒有更新recyclerview獲取新的數據,我不知道爲什麼:通知的數據集改不是爲了recyclerview

在我的主要片段,我得到了我的recyclerview的數據oncreateview這樣的:

alarms = AlarmCollection.getAlarms(getActivity()); 

,然後我將適配器設置是這樣的:

// Adapter 
    adapter = new AlarmsAdapter(getActivity(), alarms); 
    rv.setAdapter(adapter); 

然後我重新設置數據上的一個TimerTask /可運行以更新recyclerview的值(它們是人武器,所以他們每分鐘更換一次)。

這是通過一個簡單的完成通知datasetchanged:

adapter.notifyDataSetChanged(); 

的問題是,雖然你可以看到上面我通過AlarmCollection加載數據。這是從共享首選項中獲取列表。

但是,當我打電話通知數據集發生變化,這是不是被再次調用。

我的印象是,當你在recyclerview上調用notify ect時,它會更新列表或者它是否pureley更新視圖?

回答

1

正如@GpRyan提到的,問題就出在這行:

alarms = AlarmCollection.getAlarms(getActivity()); 

你做的alarms。但適配器一個新的實例每次在找你傳遞給的alarms實例變化它。所以它不會工作。

你應該做的是消除所有項目從alarms並重新添加新的數據。

alarms.removeAll(); 
alarms.addAll(AlarmCollection.getAlarms(getActivity())); 
adapter.notifyDataSetChanged(); 

注:更新alarms在你的主線程。有一次,我花了很長時間才明白更新另一個線程中的數據集 將無法​​與適配器一起使用。

0

如果您的getItemCount()返回0,那麼notifyDataSetChanged()將不會執行任何操作。

確保你已經在你的RecyclerView適配器添加getItemCount()

@Override 
public int getItemCount() { 
    return alarms.size(); 
} 

編輯:你也可以使用notifyitemrangechanged

adapter.notifyItemRangeChanged(0,alarms.size()); 
0

notifyDataSetChanged()只更新視圖。通常你會做的就是調用notifyDataSetChanged()你修改適配器保存數據(你的情況alarms

所以,你應該做的是:更新alarms你的計時器任務/可運行裏面,然後調用notifyDataSetChanged()

+0

我還會提到,這是因爲適配器指向「報警」的引用,因此當它發生更改(添加,刪除等)時,您只需讓UI知道它已經這樣做了 – GPRyan