I have problem with deleting item's from ArrayList and synchronising Adapter. I have my RecyclerView adapter with some ArrayList inside it called items. I download some list from the server and dispaly inside it. Whenever I click on some of list items I would like to delete it from server, from local ArrayList and notify the adapter about it. The problem is that when I delete everything from down to up from the list everything is ok, but when f.e. I delete 1st element from the list and then randomly some of the elements it deletes element after the one I clicked. In some cases the app crashes (f.e. I delete 1st element then the last one). The error I get is f.e.:
java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4
Look like it's something with list size but i don't know what is wrong?
Here is the function where I got position from (setPopUpListener(popupMenu, position)):
// Binding New View @Override public void onBindViewHolder(ViewHolder holder, final int position) { RecipeItem item = items.get(position); // Binding Recipe Image Picasso.with(context).load(item.getImgThumbnailLink()).into(holder.recipeItemImage); // Binding Recipe Title holder.recipeItemTitle.setText(item.getTitle()); // Binding Recipe Subtitle String subtitle = "Kuchnia " + item.getKitchenType() + ", " + item.getMealType(); holder.recipeItemSubtitle.setText(subtitle); // Binding Recipe Likes Count holder.recipeItemLikesCount.setText(Integer.toString(item.getLikeCount())); // Binding Recipe Add Date holder.recipeItemAddDate.setText(item.getAddDate()); // Binding Recipe Options Icon holder.recipeItemOptionsIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PopupMenu popupMenu = new PopupMenu(context, v); setPopUpListener(popupMenu, position); // Setting Popup Listener inflatePopupMenu(popupMenu); // Inflating Correct Menu popupMenu.show(); } }); // Item Click Listener holder.setClickListener(new RecipeItemClickListener() { @Override public void onClick(View view, int position) { // taking to recipe activity } }); } Here is setPopUpListener() - just look at removeFromFavourites(position):
// Setting Popup Listener private void setPopUpListener(PopupMenu popupMenu, final int position) { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (popupType) { // Add To Favourites Menu case 0: { switch (item.getItemId()) { case R.id.item_add: { addToFavourites(position); return true; } } } // Remove From Favourites Menu case 1: { switch (item.getItemId()) { case R.id.item_remove: { removeFromFavourites(position); return true; } } } } return false; } }); } Here is where the error appears (removeFromFavourites(position)):
// Removing User's Favourite private void removeFromFavourites(int position) { // Checking Connection Status if (!FormValidation.isOnline(context)) { showSnackbarInfo(context.getString(R.string.err_msg_connection_problem), R.color.snackbar_error_msg); } else { SQLiteHandler db = new SQLiteHandler(context); // Getting User Unique ID String userUniqueId = db.getUserUniqueId(); db.close(); RecipeItem listItem = items.get(position); // Getting Recipe Unique ID String recipeUniqueId = listItem.getUniqueId(); // Removing From User's Favourites removeFromUserFavouritesOnServer(recipeUniqueId, userUniqueId); // Removing Item From Local Array List items.remove(position); // Notifying Adapter That Item Has Been Removed notifyItemRemoved(position); } }