【发布时间】:2016-07-29 14:30:32
【问题描述】:
如果用户另有决定,我正在努力实现删除 recyclerview 条目并重新添加它的功能。为此,我显示了一个带有撤消操作的 Snackbar。
所以流程应该是:用户看到Cards 的列表,每个列表显示一些值和一个删除按钮。如果用户按下删除按钮,则卡片被删除并显示Snackbar。如果用户在Snackbar 上单击撤消,则应将Card 重新添加到RecyclerView。只有当Snackbar 超时消失时,相应的条目也应该从SQLite 数据库中删除。
我正在填充各个Cards 的TextViews,并在onBindViewHolder 中设置删除按钮的OnClickListener。
我的班级CardApater 扩展RecyclerView.Adapter<CardAdapter.CardViewHolder> 看起来像下面这样:
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 的范围之外并使用该位置重新添加它
-
知道了!谢谢你的提示
-
我应该让它成为你会接受的答案吗?
-
如果你愿意,那当然:)
-
好的,我正在做一个答案,所以如果其他人有同样的问题,可以很容易地找到它。
标签: android android-recyclerview android-cardview android-viewholder android-snackbar