2011-11-19 11 views
11

私は、各リストリストビューを作成する、次の使用するアダプタ - BaseAdapterまたはArrayAdapter?

  1. 名前
  2. メッセージ
  3. タイムスタンプ
  4. プロフィール写真のURL

の複数のインスタンスを持つJSON文字列を持っています上記を持っています。カスタムアダプターを作成するために、この特定のケースで拡張する必要があるアダプターはどれですか?

+1

http://stackoverflow.com/questions/3349693/baseadapter-or-arrayadaptor-androidこれを確認してください。 –

答えて

11

私は、いずれの場合も考慮する前にJSON文字列をオブジェクトモデルに解析していると仮定します。このクラスのProfileを呼び出してみましょう。

戦略1

アンArrayAdapterは、あなたが望む方法で、一緒にあなたの複数のフィールドを連結しますオーバーライドgetViewメソッド(..)メソッドで十分です。

ArrayAdapter<Profile> profileAdapter = new ArrayAdapter<Profile>(context, resource, profiles) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v; 
     // use the ViewHolder pattern here to get a reference to v, then populate 
     // its individual fields however you wish... v may be a composite view in this case 
    } 
} 

私は強く、潜在的に大きなリストのViewHolderパターンをお勧めします。 https://web.archive.org/web/20110819152518/http://www.screaming-penguin.com/node/7767

それは大きな違いになります。

  • 利点1.は、リストビューの各項目に複雑なレイアウトを適用することができます。
  • アドバンテージ2.目的のディスプレイに合わせるためにtoString()を操作する必要はありません(結局のところ、モデルとビューロジックを分離したままにしておくことは決して設計上の悪い習慣ではありません)。

戦略2

また、あなたの代表クラスに対してtoString()メソッドがすでにgetViewメソッドをオーバーライドすることなく、ArrayAdapter使用することができ、表示のために許容可能なフォーマットを持っている場合は()。

この戦略は簡単ですが、表示するためにすべてを1つの文字列に分割する必要があります。

ArrayAdapter<Profile> profileAdapter = new ArrayAdapter<Profile>(context, resource, profiles) 
+0

ありがとう:)何か特別な理由はありますか? –

+4

この場合、BaseAdapterをオーバーライドすると複雑さが増し、実質的な利点はありません。 getCount()、getItemId()、getItem(..)などを実装する必要があり、実装がかなり定型的であることがわかります。 – jkschneider

+0

@jkschneider - 完璧な答え。正確には、私はアレイアダプターを使用する必要があった –

関連する問題