首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修改Adapter时Listview返回异常

修改Adapter时Listview返回异常
EN

Stack Overflow用户
提问于 2011-10-28 20:31:10
回答 1查看 613关注 0票数 1

我有一个ListView,它可以显示一些数据,并且在底部有一个按钮,可以按下它来加载更多的数据。如下所示:

代码语言:javascript
运行
复制
CustomArrayAdapter a = GetInitialData();
LayoutInflater layoutInflater = 
   (LayoutInflater)context.getSystemService( Context.LAYOUT_INFLATR_SERVICE );
LinearLayout ll = 
   (LinearLayout)layoutInflater.inflate(R.layout.more_button_layout, null, false);
Button b = (Button)ll.findViewById(R.id.more_button);

b.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
    a.loadNextPage();
  }
});

lv.addFooterView(ll);
lv.setAdapter(a);

问题是,无论何时我按下按钮,我都会在适配器拥有的迭代器中得到一个ConcurrentModificationException。我相信这是因为当某个东西在遍历列表时调用了loadNextPage(),但是我想不出如何才能改变这种情况。

EN

回答 1

Stack Overflow用户

发布于 2011-10-28 20:42:09

请参阅以下URL http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html

或者尝试使用CopyOnWriteArrayList

当不允许对对象进行并发修改时,检测到此类修改的方法可能会抛出此异常。

例如,当另一个线程--或同一个线程--在集合上迭代时,通常不允许一个线程修改该集合。

请注意,此异常并不总是指示某个对象已被另一个线程并发修改。如果单个线程发出一系列违反对象契约的方法调用,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将处理此异常。

示例:

代码语言:javascript
运行
复制
for (Iterator it = myCollection.iterator(); it.hasNext()) {
Object myObject = it.next();
if (someConditionIsTrue) {
// myCollection.remove(myObject); // wrong can throw ConcurrentModificationException
it.remove(myObject); // right
}
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7929275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档