我有一个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;
答案 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。