Android Notify dataset已更改,未为recyclerview获取新数据

Android Notify dataset已更改,未为recyclerview获取新数据,android,android-recyclerview,notifydatasetchanged,Android,Android Recyclerview,Notifydatasetchanged,我有一个recyclerview没有更新,我不知道为什么: 在我的主要片段中,我在oncreateview中获得my recyclerview的数据,如下所示: alarms = AlarmCollection.getAlarms(getActivity()); 然后我像这样设置适配器: // Adapter adapter = new AlarmsAdapter(getActivity(), alarms); rv.setAdapter(adapter);

我有一个recyclerview没有更新,我不知道为什么:

在我的主要片段中,我在oncreateview中获得my recyclerview的数据,如下所示:

    alarms = AlarmCollection.getAlarms(getActivity());
然后我像这样设置适配器:

    // Adapter
    adapter = new AlarmsAdapter(getActivity(), alarms);
    rv.setAdapter(adapter);
然后我重置timertask/RunEnable上的数据,以更新recyclerview上的值(它们是警报,因此每分钟更改一次)

这是通过一个简单的notify datasetchanged完成的:

adapter.notifyDataSetChanged();
问题是,正如您在上面看到的,我通过AlarmCollection加载数据。这是从共享首选项中获取列表

但当我调用notify dataset changed时,不会再次调用它

我的印象是,当您在recyclerview上调用notify ect时,它会更新列表还是会更新视图?

如果您的
getItemCount()
返回0,则
notifyDataSetChanged()
将不起任何作用

确保在
RecyclerView
适配器中添加了
getItemCount()

@Override
public int getItemCount() {
    return alarms.size();
} 
编辑:您还可以使用
notifyitemrangechanged

adapter.notifyItemRangeChanged(0,alarms.size());
notifyDataSetChanged()
仅更新视图。通常,您要做的是在修改适配器保存的数据后调用
notifyDataSetChanged()


因此,您应该做的是:在计时器任务/runnable中更新
报警
,然后调用
notifyDataSetChanged()

,正如@GpRyan所提到的,问题在于这一行:

alarms = AlarmCollection.getAlarms(getActivity());
每次创建一个新的
报警实例
。但是适配器正在查找您传递给它的
报警实例中的更改。因此它无法工作

您应该做的是从
报警中删除所有项目
,然后再次添加新数据

alarms.removeAll();
alarms.addAll(AlarmCollection.getAlarms(getActivity()));
adapter.notifyDataSetChanged();
注意:更新主线程中的
报警
。有一次,我花了很长时间才理解如何在另一个线程中更新数据集 不适用于适配器


我还要提到,这是因为适配器指向
报警的引用,
所以当它发生更改(添加、删除等)时,您只需要让UI知道它是这样做的