RecyclerView Adding/re-adding 项

RecyclerView Adding/re-adding Items

我假设我只是没有正确理解 RecyclerView,但是我在删除项目后添加项目时遇到问题。

我的视图由带有一些文本和两个图像视图的卡片布局组成。

The two image views are stacked, and when the card is selected, the first view is flipped then, the second is flipped in and set to visible.选择项目后,用户可以编辑或删除它。

当它被删除,然后通过撤消操作恢复时,图像视图保持翻转状态。 (即使当我删除它时,我也会在删除之前将其翻转回来)。我已经包括了一个例子。

此外,如果我一次添加多个新条目,其中一些将具有翻转的图像视图。那我做错了什么?

适配器

public void unSelect(List<Message> messages) {
    for (Message message : messages) {
        if (message.isSelected()) {
            int position = mMessages.indexOf(message);
            Message m = mMessages.get(position);
            m.setSelected(false);
            m.setWasSelected(true);
            notifyItemChanged(position);
        }
    }
}

public int add(Message message) {
    int position = 0;
    if (message != null) {
        message.save();
        mMessages.add(message);
        Collections.sort(mMessages);
        Collections.reverse(mMessages);
        position = mMessages.indexOf(message);
        notifyItemInserted(position);
    }
    return position;
}

public void delete(Message message) {
    int position = mMessages.indexOf(message);
    if (position !=  -1) {
        message.setSelected(false);
        message.setWasSelected(false);
        message.delete();
        mMessages.remove(message);
        notifyItemRemoved(position);
    }
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Message message = mMessages.get(position);

    if (message.isSelected()) {
        holder.iconReverse.setVisibility(View.VISIBLE);
        holder.selected = true;
    } else if (message.wasSelected()) {
        holder.iconReverse.setVisibility(View.VISIBLE);
        holder.selected = false;
        holder.animator.reset(true);
        mMessages.set(position, message);
    }
}

观者

    ImageView icon, iconReverse, repeat;
    TextView recipient, date, message, recipientNum;

    IconAnimator animator;

    boolean hasExtraRecipient;
    boolean selected;

    public ViewHolder(View itemView) {
        super(itemView);
        icon = (ImageView) itemView.findViewById(R.id.icon);
        iconReverse = (ImageView) itemView.findViewById(R.id.icon_reverse);
        recipient = (TextView) itemView.findViewById(R.id.contact);
        recipientNum = (TextView) itemView.findViewById(R.id.recipient_num);

        animator = new IconAnimator(mContext, icon, iconReverse);
    }

    @Override
    public void onClick(final View v) {
        recipientNum.setVisibility(View.INVISIBLE);
        animator.start(selected);
        mMessages.get(getAdapterPosition()).setSelected(selected = !selected);
        if (mListener != null) {
            mListener.cardSelected(v, mMessages.get(getAdapterPosition()));
        }
    }

您忘记处理项目未被选中 (message.isSelected() == false ) 和未被选中 ( message.wasSelected() == false ) 的情况。否则RecyclerView的回收机制会导致这个问题

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Message message = mMessages.get(position);

    if (message.isSelected()) {
        holder.iconReverse.setVisibility(View.VISIBLE);
        holder.selected = true;
    } else if (message.wasSelected()) {
        holder.iconReverse.setVisibility(View.VISIBLE);
        holder.selected = false;
        holder.animator.reset(true);
        mMessages.set(position, message);
    } else {
       // add the necessary stuff 
       hereholder.selected = false;
       ....
    }
}