これは非常に深刻なバグのある動作であり、なぜこれが機能しないのかわかりません。
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に関する私の仮定は、次のとおりです。呼び出すたびに、すべての要素の再描画を強制する必要があります。しかし、これは起こりません。