Android:RecyclerView';s图像视图在滚动时被回收

Android:RecyclerView';s图像视图在滚动时被回收,android,android-recyclerview,android-imageview,android-viewholder,Android,Android Recyclerview,Android Imageview,Android Viewholder,在我的应用程序中,我有一个RecyclerView。RecyclerView的每个项目都包含表示书签项目的ImageView 我实现了一个逻辑,用于在自定义适配器中的onBindViewHolder()方法中检查用于切换ImageView内容(书签状态)的项状态 我的问题是,当我滚动视图时,我得到了ImageView的资产,尽管我的逻辑是在onBindViewHolder()上实现的。 我已经在这里尝试了这些解决方案,但没有任何帮助: 每个人都说必须在onBindViewHolder(

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

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

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

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

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

以下是我的RecyclerAdapter.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));
    }
}
}
公共类RecyclerAdapter扩展了RecyclerView.Adapter{ 语境; 列出数据模型; 公共RecyclerAdapter(上下文、列表数据模型){ mContext=上下文; mDataModels=数据模型; } @凌驾 public BasicViewHolder onCreateViewHolder(视图组父级,int-viewType){ Context=parent.getContext(); int layoutIdForListItem=R.layout.item_布局; LayoutFlater充气机=LayoutFlater.from(上下文); 布尔值shouldAttachToparentInstallent=false; 视图=充气机。充气(布局为属性、父项、应立即附加到选项); BasicViewHolder viewHolder=新的BasicViewHolder(视图); 返回视图持有者; } @凌驾 BindViewHolder上的公共无效(基本文件夹持有人,内部位置){ 固定器。绑定(位置); } @凌驾 public int getItemCount(){ 返回mDataModels.size(); } 公共类BasicViewHolder扩展了RecyclerView.ViewHolder{ 公共最终文本视图titleTextView; 公共最终图像视图书签图像视图; 公共基本视图文件夹(视图项视图){ 超级(项目视图); ButterKnife.bind(这个,itemView); titleTextView=itemView.findViewById(R.id.textView); bookmarkImageView=itemView.findViewById(R.id.imageView); } 无效绑定(int-listIndex){ titleTextView.setText(mDataModels.get(listIndex.getTitle()); //我认为这就是问题的根源 if(mDataModels.get(listIndex.isSelected())bookmarkImageView.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_bookmark)); } } }


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

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

试着这样做:

if (mDataModels.get(listIndex).isSelected()) {
    bookmarkImageView.setImageResource(R.drawable.ic_bookmark);
} else {
    bookmarkImageView.setImageDrawable(null);
}

你说得对,我只需要实现else用例:P标记为solution。非常感谢你!