2

最初に、探しているものの背景情報とパラメーターをいくつか示します。

  • アプリケーションには、1 つのリストにアクセスする必要があるアクティビティがいくつかあります。すべてのアクティビティでこのリストを維持するために、 Applicationクラスを使用しています。
  • リストは、カスタム オブジェクトのリストです。
  • このリストの項目を表示する ListView を持つアクティビティが 1 つあります。
  • このリストにアクセスできるようにする必要がある他のアクティビティがありますが、ListView は表示されません。
  • リストはソートまたはフィルタリングできます。
  • リストはバックグラウンド スレッドからいつでも更新 (コンテンツの追加、削除、更新) でき、リストを表示すると、これらの変更がすぐに反映されます。

これまでのところ、私のアプローチは、リストへの更新の管理を含め、アプリケーションのメソッドを介してリストを管理することです。ユーザーが現在、ListView を含むアクティビティにいる場合、リストへの更新をリッスンしています。更新を受信すると、アプリケーションからリストをコピーし、ListViews カスタム ArrayAdapter に送信します。ArrayAdapter は、このリストのコピーを取得してベース リストを置き換え、現在の並べ替えとフィルターを呼び出してから、実際にリストに表示されているリストを置き換えて を呼び出しますnotifyDataSetChanged()。これはすべて、リストが UI スレッドから変更された場合、またはnotifyDataSetChanged()呼び出しなしで変更された場合にアダプタに発生する問題を回避するためです。

これはすべて問題なく機能します。問題は、このアプローチでは同じリストの複数のコピーが存在するため、他の場所でのこのリストの使いやすさが低下し、不要なメモリ使用が発生することです。また、特定の間隔で多くの更新が行われると、大量のコピーが作成される可能性があります。

だから私は、ListViewがメインリストソースを直接参照できるようにするが、UIスレッドからの更新に関する問題を回避できるアプローチを他の誰かが持っているかどうかを調べていますか?

ありがとう

4

1 に答える 1

1

私のアプローチがこれ以上優れているかどうかはわかりません。アイテムの LinkedList を保持する Adapter を作成します。そのアダプターへの静的参照を保持し、更新が必要な場合は他のアクティビティなどを保持します。リストを更新し、adapter.notifyDataSetChanged() を呼び出します

これはデータのコピーを 1 つしか使用しないと思います。

于 2011-01-24T19:26:14.500 に答える