2011-10-28 18 views
1

私は、ある量のデータを表示するリストビューを持っています。これは以下のように起こる:リストビューは、アダプタが変更されたときに例外を返します。

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()が呼び出されていることが原因であると考えられますが、そうでないようにする方法を見つけることはできません。

答えて

0

は、次のURL http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html

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

で試してみてください。

たとえば、あるスレッドが別のスレッド(または同じスレッド)が繰り返し処理している間に、コレクションを変更することは一般的に不可能ではありません。

この例外は、オブジェクトが別のスレッドによって同時に変更されたことを示すとは限りません。 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

関連する問題