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中,但也ArrayAdapter将数据保存在自己的成员mObjects中。我很确定这些不是实际副本,而是对同一列表的引用。
现在,这是我的问题,如果在ListView处理过程中,由于某种原因,您必须将自己的列表替换为新的列表,我认为您也应该这样做:

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

否则ListView会没有一致性,getFilter().filter()之类的方法也不起作用。

我对么?

4

3 回答 3

2

我想,当你说 mData = data; 它只复制数据数组的指针,因为当你执行它时;

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

它更改列表。所以它保持你的源数组的指针,

其次,我认为(不确定)您不能使用适配器的过滤器功能,至少我不能使用和编写自己的过滤器功能。我从 sqlite 过滤元素(我从数据库中获取我的元素)。并使用适配器的 notifyDataSetChanged 功能。

于 2013-02-26T15:11:11.783 回答
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 回答
-1

你真的不需要很确定它是否实际复制,只需扩展 BaseAdapter

于 2013-02-26T14:52:29.170 回答