2012-07-25 9 views
14

ListFragmentには、ArrayAdapterが付いていて、Loaderが入力されています。ユーザーがアイテムの1つをクリックすると、選択したアイテムへの参照だけでなく、残りのリストアイテムも別のフラグメントに渡したいと思います。私の質問は、どのようにアダプタからすべてのアイテムを取得する必要がありますか?ArrayAdapterからすべての項目を取得する

1.バッキングList

を参照してくださいので、のようなアダプタを作成します:ここで私が見る可能性がある

List<DomainObject> items = new ArrayList<DomainObject>(); 
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine, items); 

をして、単にitemsまたはそのコピーを渡します次の活動に

私が見ている欠点は、私がコンストラクタに渡したのと同じリストに後で項目が含まれているという文書化されていない事実に頼っていることです。アダプタを介して

2.反復

項目をクリックすると、アダプタを反復処理し、リストを構築します。これは不必要な作業のようです。アイテムは、アダプタのListに含まれており、私は手動で新しいリストに各アイテムをコピーしています。

3.

は、アダプタに項目を追加する前に、アダプタ

に追加する際に、アイテムの別のリストを保持し、私はフラグメントに維持する別のリストに追加します。アイテムのリストがArrayAdapterとそのフラグメントにコピーされるので、これも無駄です。

答えて

7

:よう

何か。このAPIと戦っている場合は、それほど完全ではない(複雑な)BaseAdapterを使用する方が良いと思われます。この記事ではArrayAdapterの代わりにBaseAdapterを使用するという決定について詳しく読むことができます:Android Adapter Good Practices

+0

その記事は大部分が良いですが、私はスレッドセーフティセクション全体を無視しています。 UIスレッド以外で 'notifyDataSetChanged()'が呼び出された場合、 'ArrayAdapter'はすでにクラッシュしているのではないかと、まったく間違っています。 –

+0

@ scompt.com投稿したリンクがArrayAdapterについて間違っていると思います。それはArrayAdapter だけを説明しているようです。私は少し混乱しています... – theMfromA

+0

あなたがリンクしたページから... "テキストのみを表示できます。" =>間違っています。 msgstr "" "CharSequence項目のリストを提供するように強制します。" =>間違った "TextViewだけを含むレイアウトリソースを提供する必要があります" =>間違っています。すべての仮定は間違っています...私はArrayAdapterがBaseAdapterより優れているが、基本は間違っているという意味はありません。 – Loenix

-2

私は最初の方法はこれを行うための最善の方法だと思います。

私は考えていませんが、データは別のアクティビティのためのオリジナルです。なぜなら、あなたはバンドルを通してアイテムを渡すので、オブジェクトは最初にバンドルに書き込まれ、次にバンドルから読み取られる次のアクティビティに書き込まれるからです。

ただし、他の方法でリストを渡す場合は、元のオブジェクトを渡す代わりにlist.clone()を使用して新しいオブジェクトを作成します。

27

私はゲームに少し遅れていますが、私は同様の問題に対して立ち上がっています。

#1を処理する1つの方法は、アダプタオブジェクトによって再利用が制御されるように、サブクラスArrayAdapter内のリストへの参照を維持することです。私はその間にして行ってきたソリューションは、ちょうどArrayAdapterを使用しないことです

public class DomainAdapter extends ArrayAdapter<DomainObject> { 

    private final List<DomainObject> items; 

    public DomainAdapter(Context context, List<DomainObject> items) { 
     super(context, R.layout.mine, items); 
     this.items = items; 
    } 

    public List<DomainObject> getItems() { 
     return items; 
    } 
} 
+9

注。ある時点でアダプタをフィルタリングする予定がある場合、この方法は失敗する可能性があります。 ArrayAdapterの内部でフィルタを実行すると、Listの完全な新しいインスタンスが作成されます。つまり、あなたの外部定義 'items'はもはや同じリストにはなりません。後で修正が加えられた場合、同期が外れることになります。あなたはそれについてもっと読むことができます:http://www.jaysoyer.com/2014/07/constructor-woes-androids-arrayadapter/ –

0

クイックテストでは、方法1が有効であると表示されます。最も簡単でクリーンなようですが、文書化されていないため、ArrayAdapterの基本構造が変更された場合に、更新するたびに、意図したプラットフォームでテストしたいことがあります。

私は最善の方法は、コンストラクタへの「アイテム」を渡す変数/パラメータ「リストへの参照を保持」ではなくすることであるSDKのバージョン22と分SDKバージョン10

0

をコンパイル使用しています:

List<DomainObject> items = new ArrayList<DomainObject>(); listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine);

このように、ArrayListを空の配列としてインスタンス化するだけで、自分でリストを管理する必要があります。

関連する問題