通知数据集已更改,未为 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 alarms
in your main thread. Once, it takes me a long time that i understand updating the data set in another thread
wont work with adapter.
我有一个没有更新的 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
alarms
in your main thread. Once, it takes me a long time that i understand updating the data set in another thread wont work with adapter.