2016-12-20 7 views
0

私がクリックしたときにしかし、それは一度削除し、私が得る項目を削除しようとしていますエラー:RecyclerViewはクリックでアイテムを削除すること

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

}

私は最初の項目を削除した後に位置を更新しないことを理解しています。それはupda彼らは正しい?しかし、私はそれを修正することはできますか?私はどんな助けにも感謝します、ありがとう!

答えて

2

使用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.

、その後

notifyItemRangeChanged(index, cards.size()); 

チェックthis stackoverflow answer

+0

おかげで、それは、それらの間の違いは何であるかそう働いていましたか? – kobbycoder

+0

@kobbycoder更新の回答 –

+0

ありがとう、私はあなたの助けに感謝します。 – kobbycoder

関連する問題