При добавлении изображений из галереи RecyclerView не обновляется

package vision.developer.purposecard.adapters;

import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.card.MaterialCardView;
import com.google.android.material.chip.Chip;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;

import gun0912.tedimagepicker.builder.TedImagePicker;
import gun0912.tedimagepicker.builder.type.MediaType;
import vision.developer.purposecard.R;
import vision.developer.purposecard.additional.AnimatedRecyclerAdapter;
import vision.developer.purposecard.constants.Constants;
import vision.developer.purposecard.containers.ImageItem;
import vision.developer.purposecard.databases.Database;
import vision.developer.purposecard.helpers.ActivityHelper;
import vision.developer.purposecard.helpers.PicassoHelper;
import vision.developer.purposecard.helpers.PrefHelper;
import vision.developer.purposecard.utils.MetricsUtils;
import vision.developer.purposecard.utils.VibrationUtils;

public class ImageAdapter extends AnimatedRecyclerAdapter<ImageItem, RecyclerView.ViewHolder> {
    private static final int VIEW_TYPE_ERROR = -1;
    // database
    private Database database;

    // simple variables
    private int fId;
    private final float rows;
    private final Context context;
    private final ArrayList<ImageItem> imageItems = new ArrayList();

    public ImageAdapter(@NonNull Context context, int columnCount) {
        this.context = context;
        this.rows = 1.0f / columnCount; // рассчитываем множитель для столбцов
        initDatabase(); // инициализируем базу данных
        addItemAddImages(); // добавляем кнопку добавить изображения
    }

    public ImageAdapter(@NonNull Context context, int columnCount, int fId) {
        this.context = context;
        this.fId = fId;
        this.rows = 1.0f / columnCount; // рассчитываем множитель для столбцов
        initDatabase(); // инициализируем базу данных
        addItemAddImages(); // добавляем кнопку добавить изображения
    }

    @NotNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
        if (viewType == ImageItem.ITEM) {
            View root = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item_image, parent, false);
            root.getLayoutParams().width = (int) (MetricsUtils.getDisplayMetrics(context).widthPixels * rows);
            return (RecyclerView.ViewHolder) new ImageAdapter.ImageItemViewHolder(root);
        } else if (viewType == ImageItem.ITEM_ADD) {
            View root = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item_add_image, parent, false);
            root.getLayoutParams().width = (int) (MetricsUtils.getDisplayMetrics(context).widthPixels * rows);
            return (RecyclerView.ViewHolder) new ImageAdapter.AddImageItemViewHolder(root);
        } else {
            return null;
        }
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull RecyclerView.ViewHolder holder, int position) {
        switch (holder.getItemViewType()) {
            case ImageItem.ITEM:
                ImageAdapter.ImageItemViewHolder viewHolderItem = (ImageAdapter.ImageItemViewHolder) holder;
                ImageItem imageItem = imageItems.get(position);
                if (imageItem != null) {
                    viewHolderItem.chipClose.setOnClickListener(v -> deleteItem(position));
                    viewHolderItem.bind(imageItem);
                }
                break;
            case ImageItem.ITEM_ADD:
                ImageAdapter.AddImageItemViewHolder viewHolderItemAdd = (ImageAdapter.AddImageItemViewHolder) holder;
                viewHolderItemAdd.cardView.setOnClickListener(view -> TedImagePicker.with(context)
                        .buttonText(context.getString(R.string.add))
                        .zoomIndicator(false)
                        .max(Constants.IMAGES_GALLERY_MAX, context.getString(R.string.msg_cant_take_anymore))
                        .startAnimation(R.anim.opacity_in, R.anim.opacity_out)
                        .finishAnimation(R.anim.opacity_in, R.anim.opacity_out)
                        .mediaType(MediaType.IMAGE)
                        .startMultiImage(uriList -> {
                            for (int i = 0; i < uriList.size(); i++) {
                                ImageItem imageItem1 = new ImageItem(uriList.get(i));
                                add(imageItem1);
                            }
                        }));
                viewHolderItemAdd.bind();
                break;
            default:
                break;
        }
    }

    private void initDatabase() {
        database = ActivityHelper.getMainActivity(context).getDatabase();
    }

    public ArrayList<ImageItem> getImageItems() {
        ArrayList<ImageItem> returnList = imageItems;
        returnList.remove(imageItems.size() - 1);
        return returnList;
    }

    public void addItems(ArrayList<ImageItem> list) {
        int currentSize = imageItems.size();
        notifyItemRangeRemoved(0, currentSize); // уведомляем об изменении данных
        imageItems.addAll(list);
        notifyItemRangeInserted(0, list.size()); // уведомляем об изменении данных
        addItemAddImages(); // добавляем кнопку добавить изображения
    }

    private void addItemAddImages() {
        imageItems.add(new ImageItem(ImageItem.ITEM_ADD));
        notifyItemInserted(imageItems.size() - 1);
    }

    public void add(@NotNull ImageItem item) {
        if (fId > 0) {
            long id = database.addImageUri(fId, item.getUri());
            item.setFId(fId);
            item.setId((int) id);
        }
        removeAt(imageItems.size() - 1); // удаляем кнопку добавить изображения
        imageItems.add(item);
        notifyItemInserted(imageItems.size() - 1);
        addItemAddImages(); // добавляем кнопку добавить изображения
    }

    public void addPreloaded(@NotNull ImageItem item) {
        removeAt(imageItems.size() - 1); // удаляем кнопку добавить изображения
        imageItems.add(item);
        notifyItemInserted(imageItems.size() - 1); // уведомляем адаптер для анимации
        addItemAddImages(); // добавляем кнопку добавить изображения
    }

   /* @Override
    public long getItemId(int position) {
        return imageItems.get(position).hashCode();
    }*/

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

    public void removeAt(int i) {
        imageItems.remove(i);
    }

    @Override
    public int getItemViewType(int position) {
        ImageItem item = imageItems.get(position);
        if (item.getType() == ImageItem.ITEM) {
            return ImageItem.ITEM;
        } else if (item.getType() == ImageItem.ITEM_ADD) {
            return ImageItem.ITEM_ADD;
        } else {
            return VIEW_TYPE_ERROR;
        }
    }

    public ImageItem getItem(int position) {
        if (imageItems.isEmpty())
            return null;
        return imageItems.get(position);
    }

    public void deleteItem(int position) {
        removeAt(position); // удаляем из адаптера
        notifyItemRemoved(position); // уведомляем адаптер для анимации
        notifyItemRangeChanged(position, getItemCount());
        if (fId > 0)
            database.deleteImage(fId, position - 1); // удаляем запись по айди из бд
        if (PrefHelper.allowVibrationDelete(context))  // если вибрация удаления разрешена пользователем
            VibrationUtils.oneShotVibrate(context); // вызываем вибрацию
    }

    static class ImageItemViewHolder extends RecyclerView.ViewHolder {
        private final Context context;
        private final AppCompatImageView imageView;
        private final Chip chipClose;

        public ImageItemViewHolder(@NonNull @NotNull View itemView) {
            super(itemView);
            context = itemView.getContext();
            imageView = itemView.findViewById(R.id.imageView);
            chipClose = itemView.findViewById(R.id.chipDelete);
        }

        public void bind(ImageItem imageItem) {
            Uri imageUri = imageItem.getUri();
            if (imageUri != null)
                PicassoHelper.loadPreviewImage(context, imageView, imageUri); // загрузка изображения
            else
                imageView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_error));
        }
    }

    static class AddImageItemViewHolder extends RecyclerView.ViewHolder {
        private final MaterialCardView cardView;

        public AddImageItemViewHolder(@NonNull @NotNull View itemView) {
            super(itemView);
            cardView = itemView.findViewById(R.id.cardView);
        }
        public void bind() {

        }
    }
}


// создание адаптера
int columnCount = calculateColumns(); // рассчитываем количество колонок
ImageAdapter imageAdapter = new ImageAdapter(context, columnCount, id); // создаем адаптер
recyclerImages.setAdapter(imageAdapter);// устанавливаем адаптер
ArrayList<ImageItem> imageItems = new ArrayList<>();
database.loadImageItems(imageItems, id);
imageAdapter.addItems(imageItems);

Добрый вечер. Не могу разобраться в чем дело. При добавлении в RecyclerView новых изображений из галереи notifyItemInserted не отображает новые данные. В ArrayList все добавляется. В чем может быть дело? Пытался запускать notifyDataSetChaged - не помогает, запускать Runnable runOnUiThread - не помогает. При том, что при создании и добавлении из базы все работает замечательно, но при добавлении новых данных - никак.


Ответы (1 шт):

Автор решения: T2skler

В коде не было ошибок. Проблема заключалась в том, что я изменил контейнер содержимого на BottomSheetDialogFragment, а до этого все было в BottomSheetDialog и работало исправно. В BottomSheetDialogFragment при запуске TedImagePicker содержимое переобновлялось и добавляемые изображения не отображались.

→ Ссылка