1

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

我的适配器(扩展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 的​​假设是:每次我调用它时,它必须强制重绘所有元素。但这不会发生。

4

0 回答 0