这是一个非常严重的越野车行为,我不知道为什么这不起作用。
我的适配器(扩展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();
}
使用Loader框架,使用两个独立的AsyncTaskLoader
收集这些元素的数据。
更具体地说,这些setter是从相应的LoaderCallbacks.onLoadFinished
方法中调用的。
当用户选择显示不同的数据时,我的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
日志输出,但很重要:第二个加载器完成后,列表再次重绘。
示意性地:
列表显示新信息就好了。
但现在,我无法相信这一点。在Android 4.2上会发生以下情况:
getView pos 5(反映来自装载机1&#39的数据的变化)
结束 - 不再需要反映第二个加载器的getViews的notifyDataSetChanged!
我希望你能更清楚。
我总是在UI线程上调用notifyDataSetChanged的假设是:每次调用它时,它必须强制重绘所有元素。 但这不会发生。