2016-03-06 21 views
1

@覆蓋我正在併發修改例外here.Plz建議如何解決

protected FilterResults performFiltering(CharSequence constraint) { 
     if(constraint != null) { 
      suggestions.clear(); 
      for (DrugsInfo customer : itemsAll) { 
       if(customer.getDRUGNAME().toLowerCase().startsWith(constraint.toString().toLowerCase())){ 
        suggestions.add(customer); 
       } 
      } 
      FilterResults filterResults = new FilterResults(); 
      filterResults.values = suggestions; 
      filterResults.count = suggestions.size(); 
      return filterResults; 
     } else { 
      return new FilterResults(); 
     } 
    } 


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

我正在併發修改例外here.Plz建議如何解決..

錯誤這條線(DrugsInfo C:filteredList){

+0

這裏沒有足夠的代碼來確認。該錯誤意味着您有多個線程同時嘗試讀取/寫入集合。 –

回答

0

我在看這段代碼:

  suggestions.clear(); 
      for (DrugsInfo customer : itemsAll) { 
       if(customer.getDRUGNAME().toLowerCase().startsWith(constraint.toString().toLowerCase())){ 
        suggestions.add(customer); 
       } 
      } 

並注意到您正在清除現有列表(顯然是一個類屬性,而不是本地變量),而不是在這裏創建一個新的空列表。我敢打賭,你的suggestions列表是支持適配器的實際列表。如果我是正確的,那麼這裏發生的事情:

  • performFiltering()分配suggestionsfilterResults.values。現在filterResults.values。現在filterResults.values持有對您的適配器源列表的引用。
  • in publishResults() you assign results.values(which was from filterResults.values)to filteredList。現在,filteredList持有對適配器源列表的引用。
  • 接下來,通過在列表中運行for-each循環來創建迭代器。所以現在你在備份列表上有一個迭代器。在迭代器正在做它的事情時,該列表不能被修改(因此ConcurrentModificationException;您不能同時使用活動迭代器修改列表)。
  • 然後,您可以撥打add(c),使適配器添加到適配器源列表 - 您知道,您正在迭代的那個。
  • 迭代器現在注意到列表已被修改並拋出異常。

我與你必須非常小心,以其他變量列表分配清單Android開發的經驗教訓。很容易忘記其他變量真的是同一個列表。

您應該能夠通過改變上面的代碼片段來解決這個問題:

  ArrayList<DrugsInfo> tempList = new ArrayList<>(); 
      for (DrugsInfo customer : itemsAll) { 
       if(customer.getDRUGNAME().toLowerCase().startsWith(constraint.toString().toLowerCase())){ 
        tempList.add(customer); 
       } 
      } 
      FilterResults filterResults = new FilterResults(); 
      filterResults.values = tempList; 
      filterResults.count = tempList.size(); 

哦,對了,你可以用

  addAll(filteredList); 
將這段代碼

  for (DrugsInfo c : filteredList) { 
       add(c); 
      }