0

私は、ユーザーがそうでないと決めた場合に、recyclerviewのエントリを削除して再度追加することができます。そのために私はSnackbarを取り消し動作で表示しています。RecyclerViewからカードを削除してもう一度カードを再追加

フローは次のようになります。Cardsのリストが表示され、それぞれに値と削除ボタンが表示されます。ユーザが削除ボタンを押すと、カードは削除され、Snackbarが表示されます。 Snackbarのユーザーが元に戻すをクリックした場合、にCardを再度追加する必要があります。 Snackbarがタイムアウトで消えてしまった場合にのみ、SQLiteデータベースからそれぞれのエントリを削除する必要があります。

それぞれCardsTextViewsが入力され、削除ボタンのOnClickListeneronBindViewHolderに設定されています。

RecyclerView.Adapter<CardAdapter.CardViewHolder> follwingのように見える拡張

私のクラスCardApater

カード作品を削除
private List<CardEntry> cards; 

public CardAdapter(List<CardEntry> cards) { 
    this.cards = cards; 
} 


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

@Override 
public void onBindViewHolder(final CardViewHolder cardViewHolder, int i) { 
    final CardEntry card = cards.get(i); 

    cardViewHolder.tvDate.setText(card.date); 
    cardViewHolder.tvValue1.setText(card.value1); 
    cardViewHolder.tvValue2.setText(card.value2); 
    cardViewHolder.tvValue3.setText(card.value3); 

    cardViewHolder.deleteButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      cards.remove(cardViewHolder.getAdapterPosition()); 
      notifyDataSetChanged(); 


      Snackbar snack = Snackbar.make(view, "Deleted", Snackbar.LENGTH_LONG); 
      snack.setAction("Undo", this); 
      snack.setActionTextColor(Color.RED); 

      snack.setCallback(new Snackbar.Callback() { 
       @Override 
       public void onDismissed(Snackbar snackbar, int event) { 
        super.onDismissed(snackbar, event); 
        switch (event) { 
         case DISMISS_EVENT_ACTION: 
          cards.add(card); 
          notifyDataSetChanged(); 
          break; 
         case DISMISS_EVENT_TIMEOUT: 
          MainActivity.datasource.deleteSQLiteEntry(card.id); 
          break; 
        } 
       } 
      }); 

      snack.show(); 

     } 
    }); 
} 

@Override 
public CardViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View itemView = LayoutInflater. 
      from(viewGroup.getContext()). 
      inflate(R.layout.cardview, viewGroup, false); 

    return new CardViewHolder(itemView); 
} 

public static class CardViewHolder extends RecyclerView.ViewHolder { 

    protected TextView tvDate; 
    protected TextView tvValue1; 
    protected TextView tvValue2; 
    protected TextView tvValue3; 
    protected ImageView deleteButton; 

    public CardViewHolder(View v) { 
     super(v); 
     tvDate = (TextView) v.findViewById(R.id.date); 
     tvValue1 = (TextView) v.findViewById(R.id.value1); 
     tvValue2 = (TextView) v.findViewById(R.id.value2); 
     tvValue3 = (TextView) v.findViewById(R.id.value3); 
     deleteButton = (ImageView) v.findViewById(R.id.delete); 
    } 
} 

が、リストにCardEntryを再追加するとき、onClick方法で行cards.remove(cardViewHolder.getAdapterPosition());ArrayIndexOutOfBoundsException: length=12; index=-1とアプリがクラッシュしました。

新しいエントリを追加するときにはonClickがまったく呼び出されますか?

+1

リサイクルの可能性があります。取り外されたカードのアダプターの位置は、現在何も指していません。あなたはonBindViewHolderの範囲外の位置を保持し、それを再追加するためにそれを使用する必要があります – Pavlos

+1

!ヒントありがとうございました – daco

+0

私はそれをあなたが受け入れる答えにする必要がありますか? – Pavlos

答えて

0

リサイクルの可能性があります。取り外されたカードのアダプターの位置は、現在何も指していません。その位置をonBindViewHolderの範囲外に保ち、その位置を再追加する必要があります。

関連する問題