android - RecyclerView 添加/重新添加项目

标签 android android-imageview android-recyclerview android-viewholder

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

我的 View 由带有一些文本的卡片布局和两个 ImageView 组成。

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.选择项目后,用户可以编辑或删除它。

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

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

适配器

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

Here

最佳答案

您忘记处理项目未被选中(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;
       ....
    }
}

关于android - RecyclerView 添加/重新添加项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32030735/

相关文章:

android - 将图像从 url 转换为位图

android - ImageLoader 在选项卡更改时刷新图像

java - 具有多种 View 类型的 RecyclerView 适配器出现 IndexOutOfBoundsException

android - 如何使用 MVP 从 RecyclerView 插入/删除项目

android - 如何反转 viewpager 滑动

android - 使用 Intent 将变量传递给 Zooper 小部件

android-imageview - 将 ScaleGestureDetector 与 GestureDetector 一起使用?

android - RecyclerView - 获取所有现有的 View / View 持有者

android - 关闭选项菜单不起作用?

android - 如何在不滥用电池/RAM 的情况下检查日历时间?