通知数据集已更改,未为 recyclerview 获取新数据

Notify dataset changed not fetching new data for the recyclerview

我有一个没有更新的 recyclerview,我不确定为什么:

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

    alarms = AlarmCollection.getAlarms(getActivity());

然后我这样设置适配器:

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

然后我在 timertask/runnable 上重置数据以更新 recyclerview 上的值(它们是警报,因此每分钟更改一次)。

这是通过一个简单的通知数据集更改完成的:

adapter.notifyDataSetChanged();

问题是,正如您在上面看到的那样,我通过 AlarmCollection 加载了数据。这是从共享首选项中获取列表。

但是当我调用 notify dataset changed 时,这不会被再次调用。

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

如果你的 getItemCount() returns 0,那么 notifyDataSetChanged() 不会做任何事情。

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

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

编辑: 你也可以使用 notifyitemrangechanged

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

notifyDataSetChanged() 只更新视图。通常,您要做的是在修改适配器保存的数据后调用 notifyDataSetChanged()(在您的情况下为 alarms

所以你应该做的是:在你的定时器任务/runnable 中更新 alarms,然后调用 notifyDataSetChanged()

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

alarms = AlarmCollection.getAlarms(getActivity());

每次创建 alarms 的新实例时。但是适配器正在查找您传递给它的 alarms 实例的更改。所以它不会起作用。

您应该做的是从 alarms 中删除所有项目并再次添加新数据。

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

NOTE: Update the alarmsin your main thread. Once, it takes me a long time that i understand updating the data set in another thread wont work with adapter.