多个连续适配器notifyDataSetChanged调用不刷新ListView

时间:2014-03-24 09:18:26

标签: android listview adapter notifydatasetchanged

这是一个非常严重的越野车行为,我不知道为什么这不起作用。

我的适配器(扩展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日志输出,但很重要:第二个加载器完成后,列表再次重绘。

示意性地:

  • trigger loader 1
  • trigger loader 2
  • 装载机1完成
  • 来自装载机1的notifyDataSetChanged
  • getView pos 1(反映装载机1&#39; s数据的变化)
  • getView pos 2(反映来自加载程序1&#39的数据的变化)
  • getView pos 3(反映装载机1&#39; s数据的变化)
  • 装载机2完成
  • getView pos 4(反映装载机1&#39; s数据的变化)
  • notifyDataSetChanged fron loader 2
  • getView pos 5(反映来自加载程序1&#39的数据的变化)
  • getView pos 1(反映装载机2&#39; s数据的变化)
  • getView pos 2(反映来自加载器2&#39; s数据的更改)
  • getView pos 3(反映装载机2&#39; s数据的变化)
  • getView pos 4(反映装载机2&#39; s数据的变化)
  • getView pos 5(反映来自加载器2&#39; s数据的更改)

列表显示新信息就好了。

但现在,我无法相信这一点。在Android 4.2上会发生以下情况:

  • trigger loader 1
  • trigger loader 2
  • 装载机1完成
  • 来自装载机1的notifyDataSetChanged
  • getView pos 1(反映装载机1&#39; s数据的变化)
  • getView pos 2(反映来自加载程序1&#39的数据的变化)
  • getView pos 3(反映装载机1&#39; s数据的变化)
  • 装载机2完成
  • getView pos 4(反映装载机1&#39; s数据的变化)
  • 来自装载机2的notifyDataSetChanged
  • getView pos 5(反映来自装载机1&#39的数据的变化)

  • 结束 - 不再需要反映第二个加载器的getViews的notifyDataSetChanged!

我希望你能更清楚。

我总是在UI线程上调用notifyDataSetChanged的假设是:每次调用它时,它必须强制重绘所有元素。 但这不会发生。

0 个答案:

没有答案