RecyclerView Добавление / повторное добавление элементов

Я предполагаю, что просто не правильно понимаю RecyclerView, однако у меня возникла проблема с добавлением элемента после его удаления.

Мой вид состоит из макета карты с некоторым текстом и двумя изображениями.

Два вида изображений сгруппированы, и когда карта выбрана, первый вид затем переворачивается, второй переворачивается и становится видимым. Когда элемент выбран, пользователь может редактировать или удалять его.

Когда он удаляется, а затем возвращается с действием отмены, просмотр изображения остается перевернутым. (Даже если я удаляю его, я переворачиваю его перед удалением) Я включил пример.

Также, если я добавлю несколько новых записей одновременно, некоторые из них будут иметь перевернутое изображение. Так что я делаю не так?

Адаптер

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()));
        }
    }

Вот

1 ответ

Решение

Вы забыли обработать случай, когда элемент не выбран (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;
       ....
    }
}
Другие вопросы по тегам