При добавлении изображений из галереи 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 шт):
В коде не было ошибок. Проблема заключалась в том, что я изменил контейнер содержимого на BottomSheetDialogFragment, а до этого все было в BottomSheetDialog и работало исправно. В BottomSheetDialogFragment при запуске TedImagePicker содержимое переобновлялось и добавляемые изображения не отображались.