19

によって設定されるにListFragment裏打ちされたArrayAdapterがありLoaderます。ユーザーが項目の 1 つをクリックすると、選択した項目への参照と、残りのリスト項目を別のフラグメントに渡したいと考えています。私の質問は、アダプターからすべてのアイテムを取得するにはどうすればよいですか? 私が見る可能性は次のとおりです。

1.バッキングへの参照を保持するList

次のようにアダプターを作成します。

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

そして、それを次のアクティビティに渡すitemsかコピーするだけです。

これの欠点は、コンストラクターに渡す同じリストに後でアイテムが含まれているという文書化されていない事実に依存していることです。

2. アダプターを反復処理する

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

3.アダプターに追加するときは、項目の別のリストを保持します

アイテムをアダプターに追加する前に、フラグメントで保持している別のリストに追加します。ArrayAdapterアイテムのリストがと フラグメントにコピーされるため、これも無駄です。

4

5 に答える 5

36

私はゲームに少し遅れていますが、同様の問題に直面しました。

#1に対処する1つの方法は、のサブクラス内にリストへの参照を維持することです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;
    }
}
于 2013-03-12T14:23:05.230 に答える
8

それまでの間、私が行った解決策は、を使用しないことArrayAdapterです。この API と戦っている場合は、機能があまり充実していない (そして複雑な) を使用する方が良いようBaseAdapterです。この記事BaseAdapterの代わりに使用する決定について詳しく読むことができます: Android Adapter Good Practices .ArrayAdapter

于 2013-06-16T23:25:39.737 に答える
0

最善の方法は、「リストへの参照を保持する」ことですが、「アイテム」変数/パラメーターをコンストラクターに渡さないことです。

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

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

于 2016-06-20T09:00:12.900 に答える
0

簡単なテストでは、方法 1 が機能することが示されています。これは最も速くてクリーンに見えますが、文書化されていないため、意図したプラットフォーム全体で、また ArrayAdapter の基本構造が変更された場合に更新されるたびにテストすることをお勧めします。

コンパイル SDK バージョン 22 と最小 SDK バージョン 10 を使用しています。

于 2015-08-05T03:39:54.400 に答える
-2

これを行うには、最初の方法が最善の方法だと思います。

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

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

于 2012-07-25T13:07:15.317 に答える