Android:RecyclerView';s图像视图在滚动时被回收
在我的应用程序中,我有一个RecyclerView。RecyclerView的每个项目都包含表示书签项目的ImageView 我实现了一个逻辑,用于在自定义适配器中的onBindViewHolder()方法中检查用于切换ImageView内容(书签状态)的项状态 我的问题是,当我滚动视图时,我得到了ImageView的资产,尽管我的逻辑是在onBindViewHolder()上实现的。 我已经在这里尝试了这些解决方案,但没有任何帮助: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(
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。非常感谢你!