Android Adapter “java.lang.IndexOutOfBoundsException: Ungültiger Index 4, Größe ist 4”

Ich habe Probleme beim Löschen von Artikeln ausArrayList und synchronisierenAdapter. Ich habe meineRecyclerView Adapter mit einigenArrayList drinnen heißtitems. Ich lade eine Liste vom Server herunter und zeige sie an. Wenn ich auf einige Listenelemente klicke, möchte ich sie vom Server aus der lokalen ArrayList löschen und den Adapter darüber benachrichtigen. Das Problem ist, dass wenn ich alles von @ löscdown zuup von der Liste ist alles ok, aber wenn f.e. Ich lösche das erste Element aus der Liste und dann nach dem Zufallsprinzip einige der Elemente, die es löscht, nachdem ich auf das Element geklickt habe. In einigen Fällen stürzt die App ab (dh ich lösche das erste Element und dann das letzte). Der Fehler, den ich erhalte, ist f.e.

java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4

Look wie es ist etwas mit Listengröße, aber ich weiß nicht, was falsch ist?

Hier ist die Funktion, von der ich die Position erhalten habe 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
            }

        });
    }

Hier istsetPopUpListener() - Schau einfach aufremoveFromFavourites(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;
        }

    });
}

ier tritt der Fehler auf 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);
    }
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage