javaandroidandroid-recyclerviewnotifydatasetchanged

How to update the recycler without changing the list


My Recyclerview is filled with a list containing links to images. But the images can change (let's say the user can draw something on them), but the link to the image itself does not change. I need to make it so that when the image changes, it is also drawn again in the recycler.

notifyDataSetChanged() does not work in this case, apparently because it reacts to changes in the sheet, and in fact there are no changes in the sheet itself, the links are the same in it. But the images are changed by links.

Maybe somehow you can push the recycler so that it is updated or draws items again?

My Activity:

public class MyDrawing extends Fragment {

    private RecyclerView recyclerView;
    private RecyclerViewAdapter recyclerViewAdapter;
    private View root;
    private TextView text;

    public MyDrawing() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        root = inflater.inflate(R.layout.fragment_my_drawing, container, false);
        recyclerView = root.findViewById(R.id.recyclerViewMyDrawing);
        text = root.findViewById(R.id.text);
        List<CacheImageModel> cacheImageModels = getCacheImageByState();
        recyclerViewAdapter = new RecyclerViewAdapter(cacheImageModels, getContext());
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
        recyclerView.setAdapter(recyclerViewAdapter);
        recyclerViewAdapter.notifyDataSetChanged();
        
        return root;
    }

My Adapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    private List<CacheImageModel> cacheImageModels;
    private Context context;
    private String imgUrl;
    private int imageKey;
    private String category;
    private String nameImage;
    private ProgressBar progressBarItem;

    public RecyclerViewAdapter(List<CacheImageModel> cacheImageModels, Context context) {
        this.cacheImageModels = cacheImageModels;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recycler_view_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            imgUrl = cacheImageModels.get(position).getImageCacheUrl();
            nameImage = cacheImageModels.get(position).getName();
            category = cacheImageModels.get(position).getCategory();
            imageKey = cacheImageModels.get(position).getImageKey();
            holder.progressBarItem.setVisibility(View.VISIBLE);
            holder.relativeLayout.setLayoutParams(new FrameLayout.LayoutParams(MyApp.getScreenWidth(context) / 2,
                    MyApp.getScreenWidth(context) / 2));
            Glide.with(context)
                    .load(imgUrl)
                    .listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            holder.progressBarItem.setVisibility(View.GONE);
                            return false;
                        }
                    })
                    .into(holder.image);


        holder.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int posit = holder.getAdapterPosition();
                if (posit < 0 || posit >= cacheImageModels.size()) {
                    Log.d("POSITION", "Number postition " + posit + " its error");
                } else {
                    String urlImagePosition = cacheImageModels.get(posit).getImageCacheUrl();
                    String namePosition = cacheImageModels.get(posit).getName();
                    String categoryPosition = cacheImageModels.get(posit).getCategory();
                    int imageKeyPosition = cacheImageModels.get(posit).getImageKey();
                    Uri uri = ContentUris.withAppendedId(MCDataContract.CONTENT_URI, imageKeyPosition);
                    Intent intent = new Intent(v.getContext(),
                            ColoringActivity.class);
                    intent.putExtra("urlImagePosition", urlImagePosition);
                    intent.putExtra("nameImage", namePosition);
                    intent.putExtra("keyPosition", imageKeyPosition);
                    intent.putExtra("categoryPosition", categoryPosition);
                    intent.setData(uri);
                    v.getContext().startActivity(intent);
                }
            }
        });
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

    @Override
    public int getItemCount() {
        return cacheImageModels.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        private ImageView image;
        private ProgressBar progressBarItem;
        private RelativeLayout relativeLayout;
        private CardView cardView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            image = itemView.findViewById(R.id.imageView);
            progressBarItem = itemView.findViewById(R.id.progressBarItem);
            relativeLayout = itemView.findViewById(R.id.parentItem);
            cardView = itemView.findViewById(R.id.cardView);
        }
    }
}

Solution

  • notifyDataSetChanged() is most likely working as planned. You can set a breakpoint in your view holder binding code to check this.

    It is more likely that Glide is pulling the cached versions of the images. You will need a way to get Glide to ignore what's in cache and reload from the URL.

    This post addresses the same issue and may be of help to you.