2011-07-12 6 views
4

AndroidでさまざまなMVCタイプのパターンを実装することについて、さまざまな質問と回答を読んでいます。さまざまなブログにいくつかのコード例が掲載されています。しかし、私は達成しようとしていることについて、まだいくつかのアイデアや意見を感謝しています。具体的には、単一のビューまたはビューのグループに、特定のデータ項目が変更されたことを通知するための最良のコードメカニズムを試してみたいと思います。Android:ビューでオブザーバーパターンを使用する(おそらくMVC、MVVM関連)

私のアプリケーションは、ハードウェアデバイスから測定データをBluetoothで取得し、そのデータを表示して記録するものです。現在、私はBluetooth通信とバックグラウンドロギングを担当するサービスを持っています。私はアプリケーションの拡張である 'グローバルな'データストアクラスを持っています。

測定データが外部デバイスからポーリングされると、測定データ(実際には約30バイトのデータ)がデータストアオブジェクトで更新されます(MVCの用語では、 ')。

UIビューでは、いつでもそのデータの小さなサブセットのみが表示されます。典型的には、所与のビューは、測定データの1つの特定のバイトを表すことにのみ関心がある。ユーザーが異なるアクティビティクラスに移動すると、そのデータの別のサブセットを表示する別のビューが表示されます。

これまでのところ、特定のデータ項目が変更されたときに、興味のあるビューでinvalidate()が呼び出される最善の方法を選択しようとしています。

  1. 既存Observerクラスの使用、および関連するクラスを作成します。

    のオプションがあるように見えます。

  2. 私の独自のregister()関数とunregister()関数をデータモデルに作成することで、「独自の」オブザーバーパターンを作成できます。 Observer ViewsはArrayList(またはデータ項目ごとに1つのオブザーバーリストのより複雑な配列)で保持されます。データが更新されるたびにこのArrayListをループして、invalidate()(またはpostInvalidate()もちろん私のスレッドの配置によっては)を呼び出します。

上記のいずれかを別の方法で使用する理由はありますか?そして、私が考慮すべき他の「オブザーバー」メカニズムがありますか?

答えて

3

Androidの多くのビューは、BaseAdapterのサブクラスによってサポートされています。notifyDataSetChanged()は、ビュー自体を更新するように指示します。ビュー(ListViewまたはGridViewまたはその子孫AdapterViewなど)を使用している場合は、BaseAdapterによってサポートされています。そのアダプタを更新するだけで、ビュー自体が更新されます。

これは、組み込みのオブザーバーパターンを使用しているということです。カスタムビューを使用している場合は、明らかにこれは機能しませんので、とにかくカスタムの更新方法を使用する必要があります。

+0

ありがとうございます。非常に感謝しています。私が実際に言及しなければならないことの1つは、ビューがRelativeLayout内に構築されていることです(私が知る限り、標準のアダプタはありませんが、チェックします)。実際には面白いですが、少し前に私はこの質問をしました:http://stackoverflow.com/questions/6512705/would-it-be-advantagous-to-extend-android-widget-adapter-in-my-application/ 6513754#6513754標準アダプタインターフェイスを守らなければならないのかどうか疑問に思っていました。これが有利であるもう一つの理由であると思われます。 – Trevor

+0

その場合、唯一のオプションは、RelativeLayoutでinvalidate()を呼び出すことです。あなたが言ったようにオブザーバーを実装する必要があります。組み込みjava.util.Observableおよびjava.util.Observerは簡単な方法です。私はそれがあなたのデザイン、つまりデータがどこに保存されているかに依存していると思います。子どもたちは自分でそれをつかむか、それともそれを保存しますか?彼らがそれをつかんだら、RelativeLayoutをデータ構造体に登録し、変更が行われるたびにレイアウトを通知するようにします。 – dontocsata

関連する問題