Custom Card View Adapter: набор данных уведомления изменен, не работает - PullRequest
2 голосов
/ 11 октября 2019

Я настраиваю настраиваемый адаптер слайдера просмотра карты и при запуске представление карты нормально загружается, но после добавления / замены элементов в списке массивов и вызова метода адаптера уведомления никаких изменений в содержимом не происходит.

Я уже пытался добавить элементы напрямую из адаптера с помощью открытого метода, и элемент добавляется, однако он всегда помещается в последнюю позицию.

Это мой адаптер:

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;
        }
    }

И ниже, где я создаю экземпляр:

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 Ответ

1 голос
/ 11 октября 2019

Я бы предложил использовать notifyItemChange . Там вы используете позицию в качестве параметра, и вам не нужно перерисовывать все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...