Android:RecyclerView的ImageView在滚动时获得回收

时间:2017-12-27 00:01:26

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

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

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

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

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

每个人都说你必须在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));
    }
}
}

DataModelList only indicates to change ImageView of item at position 1

Nevertheless other items get the same ImageView when scrolling

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

1 个答案:

答案 0 :(得分:1)

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

尝试这样的事情:

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