2016-09-24 49 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