Listviewは、アダプタが変更されたときに例外を返します。

私は、いくつかのデータ量を表示する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

1 答え

See the following URL http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html

または CopyOnWriteArrayList を試してみてください

この例外は、そのような変更が許可されていない場合に、オブジェクトの同時変更を検出したメソッドによってスローされる可能性があります。

たとえば、あるスレッドがCollectionを変更するのは一般的に不可能ではありませんが、別のスレッドまたは同じスレッドがそのスレッドを反復処理しています。

この例外は、オブジェクトが別のスレッドによって同時に変更されたことを示すとは限りません。 1つのスレッドがオブジェクトの契約に違反する一連のメソッド呼び出しを発行すると、オブジェクトはこの例外をスローする可能性があります。たとえば、スレッドがフェイル・ファースト・イテレータを使用してコレクションを反復している間に、スレッドがコレクションを直接変更すると、イテレータはこの例外をスローします。

例:

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
追加された
私が抱えている問題は、それを表示するためにリストが継続的に反復されていることです - これが起こっていることを知っています、私はそれを回避する方法を知らないだけです。動的に拡張するListViewほどシンプルな処理を行うためにCopyOnWriteArrayListを使う必要はないと思います。
追加された 著者 Slubb,