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;
....
}
}