3

ListView に必要なアイテムのリストがあり、リストが大きくなるたびにカスタム アダプターを設定して動作させることができますが、プログラム フローはちょっと奇妙で、永続性に問題があります。(タブを切り替えると、UI は空の ListView で再構築されます。)

現在、私の本業は C# 開発者であるため、この問題を見ると、WPF ListView が ObservableCollection にバインドされていることがわかります。Android/Java には、UI 要素とデータ構造の間の「ファイア アンド フォーゲット」接続のようなものがありますか?

4

2 に答える 2

2
  • データを変更するたびにアダプターを交換する必要はありません。アダプターは、データとビューの間で「適応」します。適応方法が変わらない限り、アダプタを変更する必要はありません。

  • アクティビティ/フラグメントのライフサイクルは、必ずしもデータ コレクションのライフサイクルではありません。たとえば、どこかにシングルトン データ コレクションを作成し、アダプターを使用してそのコレクションを常に表示することができます。.notifyDataSetChanged()データを変更した場合は、アダプタを呼び出します。

  • Android での永続的なデータ コレクションは、おそらくデータベースによってサポートされるのが最適です。LoaderManager&を見て、ContentProviderデータを提供およびロードし、 を介して表示しCursorAdapterます。

Activity / Fragment / ..ライフサイクルの外で大量のデータを自動的に保持する方法はなく、非常に複雑になる可能性がありますが、特定のライフサイクルよりも長くデータを保持したい場合は、基本的にそれが必要です。シングルトン、、、、Activity#onSaveInstanceState()...はデータをメモリに保持するのに便利なユーティリティActivity#getLastNonConfigurationInstance()Fragment#setRetainInstance()あり、データベースは永続的なデータに適しています。

于 2013-09-10T14:30:12.147 に答える
1

自分で少し作業する必要がありますが、可能です。ContentProviderを DataSource として使用します。データの保存方法はあなた次第です。私はSQLite-DBを好むでしょう。コンテンツ プロバイダーは、ContentObserversを追加する可能性があります。(この関連する質問を参照してください。)

CourserAdapter を記述して、コンテンツ プロバイダーからデータを取得できます。また、ContentObserver はアダプターで notifyDataSetChanged() を呼び出す必要があります。これで円が閉じ、UI が更新されます。

zapls の回答に加えて、BroadcastReceiver を含むアダプターを作成することもできます。DataSource が変更されたら、LocalBroadcastを送信できます。ブロードキャスト ハンドラは、アダプタの notifyDataSetChanged() を呼び出すだけです。アクティブな要素のみがブロードキャストを取得するため、ライフサイクルの問題のほとんどはこれで回避できると思います。

Google のドキュメントには、そのようなソリューションの例があります。

于 2013-09-10T14:38:56.797 に答える