自定义卡视图适配器:通知更改的数据集不起作用

时间:2019-10-11 14:19:53

标签: java android android-studio

我设置了自定义的卡片视图滑块适配器,并在启动时很好地加载了卡片视图,但是在阵列列表中添加/替换了项目并调用了notify适配器方法之后,内容没有任何变化。

我已经尝试过通过公用方法直接从适配器中添加项目,但是该项目被添加了,但是它总是放在最后一个位置。

这是我的适配器:

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 个答案:

答案 0 :(得分:1)

我建议改用notifyItemChange。在那里,您将位置用作参数,并且不需要重绘所有内容。