Listview在修改适配器时返回异常

时间:2011-10-28 12:31:10

标签: android android-layout android-widget

我有一个显示一定数量数据的ListView,并且底部有一个按钮,可以按下该按钮来加载更多数据。这发生如下:

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()这一事实,但我无法弄清楚如何使这不是这种情况。

1 个答案:

答案 0 :(得分:0)

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

或尝试使用 CopyOnWriteArrayList

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

例如,一个线程修改Collection时通常不允许这样做,而另一个线程(或同一个线程)正在迭代它。

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

示例:

for (Iterator it = myCollection.iterator(); it.hasNext()) {
Object myObject = it.next();
if (someConditionIsTrue) {
// myCollection.remove(myObject); // wrong can throw ConcurrentModificationException
it.remove(myObject); // right
}
}