当前位置: 首页 > 知识库问答 >
问题:

Android:RecyclerView的ImageView在滚动时被回收

萧鹏云
2023-03-14

在我的应用程序中,我有一个RecyclerView。RecyclerView的每个项目都包含代表书签项目的ImageView。

我实现了一个逻辑,在自定义适配器中的onBindViewHolder()方法中检查用于切换ImageView内容(书签状态)的项状态。

我的问题是,当我滚动视图时,我得到了回收的ImageView的资产,尽管我的逻辑是在onBindViewHolder()上实现的。

我已经尝试了这些解决方案,但没有帮助:

  • 使用滚动RecycleAdapter和滚动在元素上重复背景
  • 回收人员视图导致回收时的问题
  • 回收再利用项目保持旧的背景颜色

每个人都说必须在onBindViewHolder()方法中实现逻辑,并使逻辑依赖于数据模型,但我已经做到了。

这是我的回收适配器。java代码:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.BasicViewHolder> {


Context mContext;
List<DataModel> mDataModels;

public RecyclerAdapter(Context context, List<DataModel> dataModels) {
    mContext = context;
    mDataModels = dataModels;
}

@Override
public BasicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    int layoutIdForListItem = R.layout.item_layout;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;

    View view = inflater.inflate(layoutIdForListItem, parent, shouldAttachToParentImmediately);

    BasicViewHolder viewHolder = new BasicViewHolder(view);

    return viewHolder;
}

@Override
public void onBindViewHolder(BasicViewHolder holder, int position) {
    holder.bind(position);
}

@Override
public int getItemCount() {
    return mDataModels.size();
}

public class BasicViewHolder extends RecyclerView.ViewHolder {

    public final TextView titleTextView;
    public final ImageView bookmarkImageView;

    public BasicViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
        titleTextView = itemView.findViewById(R.id.textView);
        bookmarkImageView = itemView.findViewById(R.id.imageView);
    }

    void bind(int listIndex) {
        titleTextView.setText(mDataModels.get(listIndex).getTitle());

        //I think here is where the problem is being caused
        if(mDataModels.get(listIndex).isSelected()) bookmarkImageView.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_bookmark));
    }
}
}

DataModelList仅指示更改位置1处项目的ImageView

不过,其他项目在滚动时会获得相同的ImageView

我希望你们能帮助我,谢谢你的时间。

共有1个答案

黄高爽
2023-03-14

代码的问题在于,只有在选中要绑定的项目时,才更新bookmarkImageView。由于视图回收的工作方式,确保始终更新每个视图很重要。在您的情况下,这意味着在选中项目时显示书签,在未选中项目时隐藏书签。

试试这样:

if (mDataModels.get(listIndex).isSelected()) {
    bookmarkImageView.setImageResource(R.drawable.ic_bookmark);
} else {
    bookmarkImageView.setImageDrawable(null);
}
 类似资料:
  • 我的应用程序中的CoordinatorLayout中的平滑滚动有问题。 我试图做到这一点:http://wstaw.org/m/2015/10/02/google-scroll.gif 但我最好的结果是:http://wstaw.org/m/2015/10/02/my-scroll.gif 我做错了什么?提前感谢。

  • 当我在回收器视图中选择一个项目时,会自动选择多个项目 我正在做的是 我只想获取没有重复的联系人,并在recyclerview中列出所有联系人,并使两个文本视图可见(一个用于数字,第二个用于名称)。完成了,但问题是 当我点击一个项目时,它会被点击4次(例如,如果我点击一个项目,它会显示两个文本视图,但具有相同名称和编号的相同项目会显示出来,就像我点击了4个项目并看到图片一样) 适配器类 在那里我得到

  • 我正在开发一个应用程序,它显示带有。当我滚动的值被清除时。 下面是我的代码 适配器类别: 数据模型类 不知道我哪里做错了。

  • 我有这样的场景: 从IncomingMessage表中获取(读取和删除)记录 读取记录内容 在某些表中插入某些内容 如果在步骤1-3中出现错误(任何异常),请将错误记录插入OutgoingMessage表 否则,将成功记录插入OutgoingMessage表 因此步骤1、2、3、4应该在事务中,或者步骤1、2、3、5 但是当SqlCommandHandlerService.persist()抛出异

  • 问题内容: 我一直在尝试建立一个简单的logback项目,以按日期和文件大小滚动日志文件,到目前为止,我还无法使我的附加程序滚动到另一个文件。而是将其写入 标记指定的日志。 这是我的logback.xml配置文件: 乍看起来,它应该可以工作,对吗?我做错什么了吗?我的整个可构建项目都可以在此处的zip中找到:http://www.mediafire.com/file/2bxokkdyz2i/log

  • 所以,这就是我的问题。我的recyclerview项目在底部有一个视图,我最初将其设置为消失。现在,当它们被点击时,我想让它们再次可见。所以在onClick方法中,我将视图设置为Visible。一切正常,但是当我向下滚动和向上滚动时,视图又隐藏了。我想这和取景模式有关。我想保持现状,即开放。我该怎么做?谢了。 视图支架: 点击: 编辑:上传的代码。此外,我尝试在onClick中更新Item的布尔值