Custom Card View Adapter : notify data set changed not working

Viewed 251

Im setting up a custom card-view slider adapter and on startup the card view loads up fine but after items is added/replaced in the array list and the notify adapter method is called, no changes occur to the content.

I have already tried adding the items directly from the adapter via a public method and the item gets added however, it is always placed at the last position.

This is my adapter :

static class UploadImageAdapter extends CardSliderAdapter<ImageObject>
    {
        private Context context;
        private ArrayList<ImageObject> arrayList;

        private OnUploadButtonClick onUploadButtonClick;

        public interface OnUploadButtonClick{
            void upload(int position);
        }

        UploadImageAdapter(Context context, ArrayList<ImageObject> items) {
            super(items);
            this.context = context;
            this.arrayList = items;
        }

        static class ViewHolder{
            ImageView image;
            ImageButton addImage;
            Button removeImage;
            View layout;
        }

        @Override
        public void bindView(int position, @NotNull View itemContentView, ImageObject imageObject) {
            final ViewHolder holder = new ViewHolder();

            holder.image = itemContentView.findViewById(R.id.card_image);
            holder.addImage = itemContentView.findViewById(R.id.upload_image_btn);
            holder.removeImage = itemContentView.findViewById(R.id.card_remove_btn);
            holder.layout = itemContentView.findViewById(R.id.card_image_layout);

            if (imageObject.hasImage) {
                Glide.with(context)
                        .load(Uri.parse(imageObject.getImage_path()))
                        .placeholder(R.color.offsetWhiteBackground)
                        .centerCrop()
                        .transition(withCrossFade())
                        .into(holder.image);

                holder.addImage.setVisibility(View.GONE);
                holder.layout.setVisibility(View.VISIBLE);
                holder.removeImage.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                    }
                });
            }
            else {
                holder.layout.setVisibility(View.GONE);
                holder.addImage.setVisibility(View.VISIBLE);
                holder.addImage.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onUploadButtonClick.upload(position);
                    }
                });
            }
        }

        @Override
        public ImageObject getItem(int position) {
            return arrayList.get(position);
        }

        void setOnUploadButtonClick(OnUploadButtonClick onUploadButtonClick){
            this.onUploadButtonClick = onUploadButtonClick;
        }

        @Override
        public int getItemContentLayout(int position) {
            //TODO return the item layout of every position
            return R.layout.upload_image_card;
        }
    }

And below is where i instantiate :

private void setCardSlider() {
        upload = new ArrayList<>();

        for(int i = 0; i < 3; i++){
            upload.add(new ImageObject(i,false,""));
        }

        adapter = new UploadImageAdapter(getContext(), upload);
        CardSliderViewPager cardSliderViewPager = rootView.findViewById(R.id.image_upload_slider);
        cardSliderViewPager.setAdapter(adapter);

        uploadDialog = new UploadDialog(getActivity(), getContext());

        adapter.setOnUploadButtonClick((int position) -> {
            uploadDialog.callUploadDialog();
            mPosition = position;
        });
    }

    public void uploadImage(){
        uploadDialog.callUploadDialog();
    }

    public void setImage(Uri uri){
        upload.get(mPosition).setHasImage(true);
        upload.get(mPosition).setImage_path(uri.toString());
        adapter.notifyDataSetChanged();
    }
1 Answers

I would suggest using notifyItemChange instead. There you use a position as a parameter and it doesn't need to redraw everything.

Related