2017-09-02 316 views
0

我創建這個應用程序,我有一個RecyclerView與一些圖片。如果用戶想要移除其中的一個,則他長時間按下圖片,並且用「X」按鈕在圖片的頂部顯示灰色透明佈局以移除圖片。當用戶按下「X」時會顯示一個對話框,詢問是否接受確認,然後圖片被刪除。我不明白爲什麼當我接受刪除圖片時收到「ConcurrentModificationException」。標記的行是「return data.size();」 on方法「getItemCount()」,我沒有從任何其他方面訪問「數據」,我只能看到「getItemCount」被調用了很多次。請注意,我刪除了不必要的功能和班級成員。Android - 從RecyclerView中刪除元素拋出ConcurrentModificationException

public class RecyclerViewAdAdapter extends RecyclerView.Adapter<RecyclerViewAdAdapter.ViewHolder> { 

private Context context; 
private List<String> data; 

public RecyclerViewAdAdapter(Context context, List<String> items) { 
    this.context = context; 
    this.data = items; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(context); 
    View view = inflater.inflate(R.layout.grid_create_ad_item_layout, parent, false); 
    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    String imagePath = data.get(position); 
    setImageBitmap(imagePath, holder.itemImage); 
    holder.removeItemButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(context); 
      builder.setMessage(R.string.confirm_remove_picture); 
      builder.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        removeItem(holder.getAdapterPosition()); 
       } 
      }); 
      builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 
      AlertDialog dialog = builder.create(); 
      dialog.setCancelable(true); 
      dialog.show(); 
     } 
    }); 
} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

private void removeItem(int position) { 
    data.remove(position); 
    notifyItemRemoved(position); 
    notifyItemRangeChanged(position, data.size()); 
} 

private void setImageBitmap(String item, ImageView imageView) { 
    /***/ 
} 

static class ViewHolder extends RecyclerView.ViewHolder { 

    ImageView itemImage; 
    RelativeLayout grayTopLayout; 
    ImageView removeItemButton; 

    ViewHolder(View itemView) { 
     super(itemView); 
     itemImage = (ImageView) itemView.findViewById(R.id.item_image); 
     grayTopLayout = (RelativeLayout) itemView.findViewById(R.id.grayTopLayout); 
     removeItemButton = (ImageView) itemView.findViewById(R.id.removeItemButton); 

     itemView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       switch (grayTopLayout.getVisibility()) { 
        case View.VISIBLE: 
         v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 
         grayTopLayout.setVisibility(View.GONE); 
         break; 
        case View.GONE: 
         RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) v.getLayoutParams(); 
         params.width = itemImage.getWidth(); 
         v.setLayoutParams(params); 
         v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 
         grayTopLayout.setVisibility(View.VISIBLE); 
         break; 
        case View.INVISIBLE: 
         break; 
       } 
       return false; 
      } 
     }); 
    } 
} 

}

回答

1

這足以notifyItemRemoved方法。刪除notifyItemRangeChanged你的代碼應該是這樣的

private void removeItem(int position) { 
data.remove(position); 
notifyItemRemoved(position); 
} 

編輯

而不是使用List使用CopyOnWriteArrayList的。 CopyOnWriteArrayList防止

ConcurrentModificationException

+0

沒有工作:( – Ramin

+0

@Ramin你shoure沒有其他人訪問您的陣列? –

+0

@Ramin看到我的編輯 –