【问题标题】:Deleting Card from RecyclerView and re-add it again从 RecyclerView 中删除 Card 并重新添加
【发布时间】:2016-07-29 14:30:32
【问题描述】:

如果用户另有决定,我正在努力实现删除 recyclerview 条目并重新添加它的功能。为此,我显示了一个带有撤消操作的 Snackbar

所以流程应该是:用户看到Cards 的列表,每个列表显示一些值和一个删除按钮。如果用户按下删除按钮,则卡片被删除并显示Snackbar。如果用户在Snackbar 上单击撤消,则应将Card 重新添加到RecyclerView。只有当Snackbar 超时消失时,相应的条目也应该从SQLite 数据库中删除。

我正在填充各个CardsTextViews,并在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


【解决方案1】:

这可能是因为回收。已移除卡的适配器位置,当前没有指向任何内容。您应该将该位置保持在 onBindViewHolder 的范围之外,并使用该位置重新添加它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2015-09-18
    相关资源
    最近更新 更多