私は、ユーザーがそうでないと決めた場合に、recyclerviewのエントリを削除して再度追加することができます。そのために私はSnackbar
を取り消し動作で表示しています。RecyclerViewからカードを削除してもう一度カードを再追加
フローは次のようになります。Cards
のリストが表示され、それぞれに値と削除ボタンが表示されます。ユーザが削除ボタンを押すと、カードは削除され、Snackbar
が表示されます。 Snackbar
のユーザーが元に戻すをクリックした場合、にCard
を再度追加する必要があります。 Snackbar
がタイムアウトで消えてしまった場合にのみ、SQLite
データベースからそれぞれのエントリを削除する必要があります。
それぞれCards
のTextViews
が入力され、削除ボタンのOnClickListener
がonBindViewHolder
に設定されています。
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
がまったく呼び出されますか?
リサイクルの可能性があります。取り外されたカードのアダプターの位置は、現在何も指していません。あなたはonBindViewHolderの範囲外の位置を保持し、それを再追加するためにそれを使用する必要があります – Pavlos
!ヒントありがとうございました – daco
私はそれをあなたが受け入れる答えにする必要がありますか? – Pavlos