这是一个非常严重的错误行为,我不知道为什么这不起作用。
我的适配器(扩展BaseAdapter
)结合了两种独立的数据类型。一个是游标,另一个是元素列表。两者的设置器都获取数据和强制notifyDataSetChanged()
:
public void setInformationsCursor(final Cursor newCursor) {
Log.d(TAG, "setInformationsCursor called");
if (newCursor == informationsCursor) {
return;
}
informationsCursor = newCursor;
// work on cursor here to extract data
notifyDataSetChanged();
}
public void setRides(final List<Ride> newRideList) {
Log.d(TAG, "setRides called");
rideList = newRideList;
notifyDataSetChanged();
}
这些元素的数据是使用两个独立AsyncTaskLoader
的 Loader 框架收集的。更具体地说,这些设置器是从相应的LoaderCallbacks.onLoadFinished
方法中调用的。
当用户选择显示不同的数据时,两个 Loader 都会在 my 中触发Fragment
:
getLoaderManager().restartLoader(RIDE_LOADER_ID, args, rideLoaderCallbacks);
getLoaderManager().restartLoader(INFORMATION_LOADER_ID, args, informationLoaderCallbacks);
为了可视化 的重绘ListView
,我在适配器的getView
方法中登录。
在我运行 Android 4.3 的主要开发设备上,一切正常。
1) 用户触发器更改 2) 两个加载器触发 3) 两个加载器独立完成,每次触发notifyDataSetChanged
,我看到很多getView
日志输出,但重要的是:在第二个加载器完成后,列表再次重绘。
示意图:
- 触发装载机 1
- 触发装载机 2
- 装载机 1 完成
- notifyDataSetChanged 从加载器 1
- getView pos 1(反映加载程序 1 数据的更改)
- getView pos 2(反映加载程序 1 数据的更改)
- getView pos 3(反映加载程序 1 数据的更改)
- 装载机2完成
- getView pos 4(反映加载程序 1 数据的更改)
- notifyDataSetChanged from loader 2
- getView pos 5(反映加载程序 1 数据的更改)
- getView pos 1(反映加载程序 2 数据的更改)
- getView pos 2(反映加载程序 2 数据的更改)
- getView pos 3(反映加载程序 2 数据的更改)
- getView pos 4(反映加载程序 2 数据的更改)
- getView pos 5(反映加载程序 2 数据的更改)
该列表显示新信息就好了。
但现在,我无法相信这一点。在 Android 4.2 上会发生以下情况:
- 触发装载机 1
- 触发装载机 2
- 装载机 1 完成
- notifyDataSetChanged 从加载器 1
- getView pos 1(反映加载程序 1 数据的更改)
- getView pos 2(反映加载程序 1 数据的更改)
- getView pos 3(反映加载程序 1 数据的更改)
- 装载机2完成
- getView pos 4(反映加载程序 1 数据的更改)
- notifyDataSetChanged 来自加载程序 2
getView pos 5(反映加载程序 1 数据的更改)
结束 - 不再有应该反映第二个加载程序的 notifyDataSetChanged 的 getViews!
我希望这对你来说更清楚。
我对始终在 UI 线程上调用的 notifyDataSetChanged 的假设是:每次我调用它时,它必须强制重绘所有元素。但这不会发生。