首页 > 解决方案 > 如何修复:'notifyDataSetChanged() 未更新 RecyclerView 适配器中的 ImageView'

问题描述

假设我有一个 recyclerView 适配器,用于填充包括 imageView 在内的视图。当我第一次加载适配器时,回收站视图项目会正确显示。但是,如果我更新适配器数据源中的 imageView 和 textview 资源并调用 notifyDataSetChanged() 方法,那么只有 textview 得到更新,而不是 imageView 。谁能帮我这个 ?提前致谢 。

例如 - 这是我第一次在片段内的空数组列表中添加所有元素并使用 notifyDataSetChanged() 方法进行更新。到目前为止,一切都很好,图像在适配器中正确加载。

下面是getMethod()

                    if(remindersListResponse.code == 200)
                    {
                        if(remindersListResponse.data != null)
                        {
                            photoContactList.clear();

                           photoContactList.addAll(remindersListResponse.data);
                            photoContactsAdapter.notifyDataSetChanged();
                        }

                    }

现在,如果我在片段中单击某个按钮时再次调用 getMethod 并使用 notifyDataSetChanged() 方法。然后只有文本在适配器项目中得到更新,而不是图像而不是它们会消失。

这是我的适配器 onBindViewHolder(...) 方法

@Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {

        final PhotoContactsResponse.Result photoContactDetail = photoContactList.get(i);

        viewHolder.photoContactName.setText(photoContactDetail.name);

        if(photoContactDetail.image!=null && !photoContactDetail.image.isEmpty()) {
            viewHolder.addPhotoText.setVisibility(View.GONE);
            Picasso.with(context)
                    .load(Constants.WEB_SERVICE_BASE_URL_FOR_IMAGE+photoContactDetail.image)
                    .networkPolicy(NetworkPolicy.NO_CACHE)
                    .memoryPolicy(MemoryPolicy.NO_CACHE)
                    .into(viewHolder.photoContactImage);
        }
        else
        {
            viewHolder.addPhotoText.setVisibility(View.VISIBLE);
            viewHolder.photoContactImage.setVisibility(View.GONE);
        }
}

这是我的模型课

public static class Result{
        public int id;
        public String name;
        public String number;
        public String image;
        public int index;
    }

标签: androidandroid-layoutandroid-adapterandroid-adapterview

解决方案


我认为您忘记将 ImageView 设置为可见。当您将其隐藏在else语句中时,您应该始终在图像可用时将其带回来。onBindViewHolder仅将数据绑定到视图。Recycler 视图在方法调用之间被重用onBindViewHolder

@Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {

        final PhotoContactsResponse.Result photoContactDetail = photoContactList.get(i);

        viewHolder.photoContactName.setText(photoContactDetail.name);

        if(photoContactDetail.image!=null && !photoContactDetail.image.isEmpty()) {
            viewHolder.addPhotoText.setVisibility(View.GONE); 
            viewHolder.photoContactImage.setVisibility(View.VISIBLE); // <== ADD THIS LINE

            Picasso.with(context)
                    .load(Constants.WEB_SERVICE_BASE_URL_FOR_IMAGE+photoContactDetail.image)
                    .networkPolicy(NetworkPolicy.NO_CACHE)
                    .memoryPolicy(MemoryPolicy.NO_CACHE)
                    .into(viewHolder.photoContactImage);
        }
        else
        {
            viewHolder.addPhotoText.setVisibility(View.VISIBLE);
            viewHolder.photoContactImage.setVisibility(View.GONE);
        }
}

推荐阅读