addAll 如何在 android 列表适配器中工作?

How does addAll work in an android List adapter?

我有一个带有适配器的列表视图,该适配器在其构造函数中接收 ArrayListArrayList 被分配给一个内部变量——像这样:

ArrayList<Someobject> mylist;

constructor(ArrayList<Someobject> inputList) {
    this.mylist = inputList;
}

然后我在 getView() 方法中使用这个 ArrayList 来使用 viewholder 模式构建我的列表小部件。问题是 - 当我使用 adapter.clear()adapter.addAll(somenewArray) 时 - 适配器如何知道用新变量替换我的适配器的 ArrayList 变量或清除它?据我所知 - 它没有。我的 getview() 看起来像这样:

public View getView(final int position, View convertView, ViewGroup parent) {
    ...
    setValueTo(mylist.get(position));
}

并且变量 "mylist" 始终保持不变,无论我将什么传递给 addAll()。我觉得我在这种机制的运作方式中遗漏了一些基本的东西 - 谁能帮我弄清楚是什么?

我原以为适配器会在每次调用 addAll() 时自动销毁并重新创建(因此其内部数组列表会更改),但在初始创建后再也不会调用构造函数。

解决此问题的正确方法是覆盖 addAll() 并执行以下手动操作:

this.mylist = newlist;

?

您不应该在适配器中有自己的列表成员。 ArrayAdapter 本身保存项目列表。 一旦您使用适配器中的不同方法(获取、添加等),一切都会按预期工作。

您的 getView() 应如下所示:

public View getView(final int position, View convertView, ViewGroup parent) {
   ....
   setValueTo(getItem(position));
}

当使用ArrayAdpater时,列表已经"included"给你了,你不需要单独维护一个。您可以将其视为您的 collection 和您的适配器。

像这样将项目添加到您的适配器

adapter.add(item);

adapter.addAll(collection);

并获取指定位置的物品:

adapter.getItem(position);

使用 notifyDataSetChanged()
对于 ArrayAdapter,只有在适配器上使用 add()、insert()、remove() 和 clear() 时,notifyDataSetChanged 才有效。
喜欢

inputList.add(..);
adapter.notifyDataSetChanged();

我认为在调用添加所有内容后,您可以从适配器调用 notifyDataSetChanged()。我将触发对其附加的列表视图的刷新。

看看文档是怎么说的。

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

在这种情况下,您的列表视图应该在观察者中。