0

I am trying to remove an item when clicking however it removes once and then i get the an error:

ERROR

Process: com.example.cardgame, PID: 3345
                  java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 10(offset:10).state:11

CODE

public class HandViewAdapter extends RecyclerView.Adapter<HandViewAdapter.ViewHolder>{
    private ArrayList<Card> cards;
    private Context context;

public HandViewAdapter(ArrayList<Card> cards, Context context) {
    this.cards = cards;
    this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    View cardView = inflater.inflate(R.layout.card, parent, false);

    return new ViewHolder(cardView);
}

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    Card card = this.cards.get(position);

    if (position == 0) {
        card.setStatus(CardStatus.down);
    } else {
        card.setStatus(CardStatus.up);
    }

// Here i put the listener since i have tried other methods but i have no success to run them
    holder.cardLayoutView.getCardView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            remove(position);
        }
    });
}

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

public Card remove(int index) {
    cards.remove(index);
    notifyItemChanged(index);
    notifyItemRangeChanged(index, cards.size());
    return null;
}

public static class ViewHolder extends RecyclerView.ViewHolder implements CardBehavior {
    public CardLayoutView cardLayoutView;

    public ViewHolder(View view) {
        super(view);
        this.cardLayoutView = new CardLayoutView(view);

    }

    @Override
    public void faceDown() {
        this.cardLayoutView.faceDown();
    }

    @Override
    public void faceUp(Card card, Context context) {
        this.cardLayoutView.faceUp(card, context);
    }
}

}

I understand that it doesn't update the positions after deleting the first item, it should update them right? but it doesn't, how can i fix it? I would appreciate any help, Thank you!

kobbycoder
  • 682
  • 2
  • 10
  • 33

1 Answers1

2

Use notifyItemRemoved

notifyItemRemoved(index)

Notify any registered observers that the item previously located at position has been removed from the data set. The items previously located at and after position may now be found at oldPosition - 1.

and then

notifyItemRangeChanged(index, cards.size());

Check this stackoverflow answer

Community
  • 1
  • 1
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103