addAll如何在Android List适配器中工作?

时间:2015-01-29 14:13:12

标签: java android listview adapter

我有一个listview,其中包含一个在其构造函数中接收ArrayList的适配器。 ArrayList被分配给内部变量 - 如下所示:

ArrayList<Someobject> mylist;

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

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

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

,无论我传入addAll(),变量“mylist”始终保持不变。我觉得我错过了这种机制运作方式的基本功能 - 任何人都可以帮我弄明白什么吗?

我原本以为每次调用addAll()时都会自动销毁并重新创建适配器(因此它的内部arraylist会改变),但是在初始创建之后永远不会再次调用构造函数。

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

this.mylist = newlist;

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

您的getView()应如下所示:

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

答案 2 :(得分:1)

使用ArrayAdpater时,列表已经包含了#34;&#34;对你来说,你不需要另外一个。您可以将其视为您的集合和适配器。

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

adapter.add(item);

adapter.addAll(collection);

并获取给定位置的项目:

adapter.getItem(position);

答案 3 :(得分:0)

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

查看相关文档的说明。

  

通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。

在这种情况下,您的列表视图应该是obervers。