0

拡張するカスタムアダプタを作成する場合ArrayAdapter<T>、通常は次の形式になります。

public class ListAdapter extends ArrayAdapter<Item> {

    private List<Item> mData;

    public ListAdapter(Context context, int resource, List<Item> data) {
        super(context, resource, data);
        mData = data;
    }
}

データは最初はプライベートメンバーに保存されますが、独自のメンバーにmDataも保存されます。これらは実際のコピーではなく、同じリストへの参照であると確信しています。 さて、これが私の質問です。ListViewの処理中に、何らかの理由で自分のリストを新しい新しいリストに置き換える必要がある場合は、次のことも行う必要があると思います。ArrayAdaptermObjects

mData = new List<Item>();
super.clear();
super.addAll(mData);

そうしないと、ListViewに一貫性がなくなり、getFilter()。filter()などのメソッドが機能しなくなります。

私は正しいですか?

4

3 に答える 3

2

あなたが正しいです。ListAdapter提供されたリストの詳細なコピーは作成しませんItems。これは、Itemインスタンスを「外部」に変更すると、が無効な状態にListAdapterなることを意味します。ListAdapter

ただし、を呼び出すことnotifyDataSetChangedでこれを「修正」できますListAdapter

List<Item> itemList = ....
....
....
ListAdapter adapter = new ListAdapter(this, R.layout.somelayout, itemList);
....

これで、ListAdapterの「外側」にあるアイテムを変更した場合でも、ListAdapterを変更と同期させることができます。

itemList.get(idx).changeSomethingInItem("Hello"); // Changes the Item at index 'idx'.
adapter.notifyDataSetChanged();                   // Notify adapter about this change.
于 2013-02-26T15:10:45.843 に答える
2

あなたがmData=dataと言うとき、私は思います。データ配列のポインタのみをコピーします。これを実行すると、

ListAdapter adapter = new ListAdapter(context, resource, data);
data.clear();
adapter.notifyDataSetChanged();

リストを変更します。したがって、ソース配列のポインタを保持します。

第二に、アダプターのフィルター機能は使えないと思いますが、少なくとも自分でフィルター機能を使って書くことはできませんでした。sqliteから要素をフィルタリングします(データベースから要素を取得します)。アダプターのnotifyDataSetChanged関数を使用します。

于 2013-02-26T15:11:11.783 に答える
-1

それが実際のコピーであるかどうかを本当に確認する必要はありません。BaseAdapterを拡張するだけです。

于 2013-02-26T14:52:29.170 に答える