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);
}
}