addAll 如何在 android 列表适配器中工作?
How does addAll work in an android List adapter?
我有一个带有适配器的列表视图,该适配器在其构造函数中接收 ArrayList
。 ArrayList
被分配给一个内部变量——像这样:
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.
在这种情况下,您的列表视图应该在观察者中。
我有一个带有适配器的列表视图,该适配器在其构造函数中接收 ArrayList
。 ArrayList
被分配给一个内部变量——像这样:
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.
在这种情况下,您的列表视图应该在观察者中。