Android: RecyclerView 的 ImageView 在滚动时被回收
Android: RecyclerView's ImageView get Recycled at Scrolling
在我的应用程序中,我有一个 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));
}
}
}
DataModelList only indicates to change ImageView of item at position 1
Nevertheless other items get the same ImageView when scrolling
希望大家能帮帮我,谢谢你的时间。
您的代码存在问题,您仅在选择要绑定的项目时才更新 bookmarkImageView
。由于视图回收的工作方式,确保 始终 更新每个视图很重要。在您的情况下,这意味着当项目被选中时显示书签,而当项目未被选中时隐藏书签。
尝试这样的事情:
if (mDataModels.get(listIndex).isSelected()) {
bookmarkImageView.setImageResource(R.drawable.ic_bookmark);
} else {
bookmarkImageView.setImageDrawable(null);
}
在我的应用程序中,我有一个 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));
}
}
}
DataModelList only indicates to change ImageView of item at position 1
Nevertheless other items get the same ImageView when scrolling
希望大家能帮帮我,谢谢你的时间。
您的代码存在问题,您仅在选择要绑定的项目时才更新 bookmarkImageView
。由于视图回收的工作方式,确保 始终 更新每个视图很重要。在您的情况下,这意味着当项目被选中时显示书签,而当项目未被选中时隐藏书签。
尝试这样的事情:
if (mDataModels.get(listIndex).isSelected()) {
bookmarkImageView.setImageResource(R.drawable.ic_bookmark);
} else {
bookmarkImageView.setImageDrawable(null);
}