2016-12-24 5 views
1

私は時々継承されてきたいくつかのソースコードは、この行のConcurrentModificationExceptionをスローします:ConcurrentModificationExceptionがArrayAdapter

for (String c : filteredList) { 

体:

@Override 
protected void publishResults(CharSequence constraint, FilterResults results) { 
    ArrayList<String> filteredList = (ArrayList<String>) results.values; 
    if (results != null && results.count > 0) { 
     clear(); 
     for (String c : filteredList) { 
      add(c); 
     } 
     notifyDataSetChanged(); 
    } 
} 

がどのように私は起きてからこのエラーを回避する必要がありますか?

+1

通常、私はちょうど反復のさらなるラウンドの代わりに直接フィルタリングされたリストを使用します。フィルタの基準が空/空の場合は、常に完全なリストへの参照を保持できます。 – Karakuri

+1

'ArrayAdapter'では、項目の扱いの多くが内部的で利用できない(そして悲しいことに、' setItems(List ) 'メソッドを持っていないので本当に残念です) 。私は、代わりにBaseAdapterを拡張することで、あなたの人生を楽にすることができると思います.ArrayAdapterが提供するものは、再作成するのが非常に簡単です。 – Karakuri

+0

BaseAdapterを拡張しないでArrayAdapterを使用しているときに、この致命的な問題のホットフィックスは何になりますか? –

答えて

2

にConcurrentModificationException:

それは一般的に、別のスレッドがそれを反復処理している間コレクションを修正するための一つのスレッドのために許可されていない...

修正プログラムのソリューションは、クローニングされるだろうArrayList<String>、それを繰り返す前に:

ArrayList<String> filteredList = (ArrayList<String>) results.values.clone(); 

あなたそのリストが大きい場合は、その期間中に2倍のRAMを消費することを考慮する必要があります。

ところで、私はパフォーマンスの改善として、あなたの最初の2行を切り替え、あなたのリストのクローンを作成/マップする前に、最初の検証を実行します:

@Override 
protected void publishResults(CharSequence constraint, FilterResults results) { 
    if (results != null && results.count > 0) { 
     ArrayList<String> filteredList = (ArrayList<String>) results.values.clone(); 
     clear(); 
     for (String c : filteredList) { 
      add(c); 
     } 
     notifyDataSetChanged(); 
    } 
} 

はそれが役に立てば幸い!乾杯、

関連する問題