1

これは非常に深刻なバグのある動作であり、なぜこれが機能しないのかわかりません。

My Adapter (extending BaseAdapter) は、2 つの独立したタイプのデータを結合します。1 つはカーソルで、もう 1 つは要素のリストを取ります。両方のセッターが data と force を受け取ります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、ローダー フレームワークを使用して 2 つの独立した方法で収集されます。具体的には、これらのセッターは対応するLoaderCallbacks.onLoadFinishedメソッドから呼び出されます。

ユーザーが異なるデータを表示することを選択すると、両方のローダーが my で起動されますFragment

getLoaderManager().restartLoader(RIDE_LOADER_ID, args, rideLoaderCallbacks);
getLoaderManager().restartLoader(INFORMATION_LOADER_ID, args, informationLoaderCallbacks);

の再描画を視覚化するために、アダプターのメソッドListView内でログを記録します。getView

Android 4.3 を実行しているメインの開発デバイスでは、すべてが期待どおりに動作します。

1) ユーザー トリガーが変更される 2) 両方のローダーが起動する 3) 2 つのローダーが個別に起動し、それぞれが起動し、notifyDataSetChanged多くのgetViewログ出力が表示されますが、重要なのは、2 番目のローダーが終了した後、リストが再び再描画されることです。

概略的に:

  • トリガーローダー1
  • トリガーローダー2
  • ローダー1完成
  • ローダー 1 からの notifyDataSetChanged
  • getView pos 1 (ローダー 1 のデータからの変更を反映)
  • getView pos 2 (ローダー 1 のデータからの変更を反映)
  • getView pos 3 (ローダー 1 のデータからの変更を反映)
  • ローダー2完成
  • getView pos 4 (ローダー 1 のデータからの変更を反映)
  • ローダー 2 からの notifyDataSetChanged
  • 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完成
  • ローダー 1 からの notifyDataSetChanged
  • getView pos 1 (ローダー 1 のデータからの変更を反映)
  • getView pos 2 (ローダー 1 のデータからの変更を反映)
  • getView pos 3 (ローダー 1 のデータからの変更を反映)
  • ローダー2完成
  • getView pos 4 (ローダー 1 のデータからの変更を反映)
  • ローダー 2 からの notifyDataSetChanged
  • getView pos 5 (ローダー 1 のデータからの変更を反映)

  • THE END - 2 番目のローダーの notifyDataSetChanged を反映する getView はもうありません。

これがより明確になることを願っています。

UIスレッドで常に呼び出されるnotifyDataSetChangedに関する私の仮定は、次のとおりです。呼び出すたびに、すべての要素の再描画を強制する必要があります。しかし、これは起こりません。

4

0 に答える 0