package com.dayu.pipirrapp.adapter; import android.content.Context; import android.net.Uri; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.dayu.pipirrapp.R; import com.dayu.pipirrapp.bean.net.UplodFileState; import com.dayu.pipirrapp.listener.OnItemLongClickListener; import com.dayu.pipirrapp.utils.MyLog; import com.king.view.circleprogressview.CircleProgressView; import com.luck.picture.lib.config.PictureMimeType; import com.luck.picture.lib.config.SelectMimeType; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.utils.DateUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * AddPictureAdapter - * 添加图片 * * @author zuoxiao * @version 1.0 * @since 2024-11-28 */ public class AddPictureAdapter extends RecyclerView.Adapter { public static final String TAG = "PictureSelector"; public static final int TYPE_CAMERA = 1; public static final int TYPE_PICTURE = 2; private final LayoutInflater mInflater; private final ArrayList list = new ArrayList<>(); Map fileStates; private int selectMax = 9; private final Context mContext; public AddPictureAdapter(Context context, List result, Map fileStates) { this.mInflater = LayoutInflater.from(context); this.list.addAll(result); this.mContext = context; this.fileStates = fileStates; } public void setSelectMax(int selectMax) { this.selectMax = selectMax; } public int getSelectMax() { return selectMax; } public ArrayList getData() { return list; } public void remove(int position) { if (position < list.size()) { list.remove(position); } } @Override public int getItemCount() { if (list.size() < selectMax) { return list.size() + 1; } else { return list.size(); } } @Override public int getItemViewType(int position) { if (isShowAddItem(position)) { return TYPE_CAMERA; } else { return TYPE_PICTURE; } } /** * 创建ViewHolder */ @NonNull @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = mInflater.inflate(R.layout.item_add_filter_image, viewGroup, false); return new ViewHolder(view); } private boolean isShowAddItem(int position) { int size = list.size(); return position == size; } /** * 设置值 */ @Override public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) { //少于MaxSize张,显示继续添加的图标 if (getItemViewType(position) == TYPE_CAMERA) { viewHolder.mImg.setImageResource(R.mipmap.ic_add_image); viewHolder.mImg.setOnClickListener(view -> { if (mItemClickListener != null) { mItemClickListener.openPicture(); } }); viewHolder.mIvDel.setVisibility(View.INVISIBLE); viewHolder.circleProgressView.setVisibility(View.GONE); viewHolder.maskLayerBg.setVisibility(View.GONE); } else { //删除图片 viewHolder.mIvDel.setVisibility(View.VISIBLE); viewHolder.mIvDel.setOnClickListener(view -> { int index = viewHolder.getAbsoluteAdapterPosition(); if (index != RecyclerView.NO_POSITION && list.size() > index) { mItemClickListener.onDeleteClick(index); list.remove(index); notifyItemRemoved(index); notifyItemRangeChanged(index, list.size()); } }); LocalMedia media = list.get(position); int chooseModel = media.getChooseModel(); String path = media.getAvailablePath(); long duration = media.getDuration(); viewHolder.tvDuration.setVisibility(PictureMimeType.isHasVideo(media.getMimeType()) ? View.VISIBLE : View.GONE); if (chooseModel == SelectMimeType.ofAudio()) { viewHolder.tvDuration.setVisibility(View.VISIBLE); viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds (R.mipmap.ps_ic_audio, 0, 0, 0); } else { viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds (R.mipmap.ps_ic_video, 0, 0, 0); } viewHolder.tvDuration.setText(DateUtils.formatDurationTime(duration)); if (chooseModel == SelectMimeType.ofAudio()) { viewHolder.mImg.setImageResource(R.drawable.ps_audio_placeholder); } else { Glide.with(viewHolder.itemView.getContext()) .load(PictureMimeType.isContent(path) && !media.isCut() && !media.isCompressed() ? Uri.parse(path) : path) .centerCrop() .placeholder(R.color.app_color_f6) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(viewHolder.mImg); } // 更新进度 UplodFileState uplodFileState = TextUtils.isEmpty(media.getCompressPath()) ? fileStates.get(media.getRealPath()) : fileStates.get(media.getCompressPath()); if (uplodFileState != null) { MyLog.d("progressRequestBodyHolder>>>" + "path:" + uplodFileState.getFilePath() + ">>>position:" + position); uplodFileState.setAdapterPosition(position); MyLog.d("progressRequestBodyHolder>>>" + "State:" + uplodFileState.getState() + ">>>position:" + position + ">>>Progress: " + uplodFileState.getProgress()); if (uplodFileState.getState() == UplodFileState.STATE_UPDING) { MyLog.d("progressRequestBodyHolder>>>" + "正在上传"); viewHolder.postError.setVisibility(View.GONE); if (uplodFileState.getProgress() < 100) { viewHolder.maskLayerBg.setVisibility(View.VISIBLE); viewHolder.circleProgressView.setVisibility(View.VISIBLE); viewHolder.circleProgressView.setProgress(uplodFileState.getProgress()); } else { viewHolder.circleProgressView.setVisibility(View.GONE); viewHolder.maskLayerBg.setVisibility(View.GONE); } } else if (uplodFileState.getState() == UplodFileState.STATE_DONE) { MyLog.d("progressRequestBodyHolder>>>" + "完成"); viewHolder.maskLayerBg.setVisibility(View.GONE); viewHolder.circleProgressView.setVisibility(View.GONE); } else { MyLog.d("progressRequestBodyHolder>>>" + "错误"); viewHolder.maskLayerBg.setVisibility(View.VISIBLE); viewHolder.postError.setVisibility(View.VISIBLE); viewHolder.circleProgressView.setVisibility(View.GONE); } } //itemView 的点击事件 if (mItemClickListener != null) { viewHolder.itemView.setOnClickListener(v -> { int adapterPosition = viewHolder.getAbsoluteAdapterPosition(); mItemClickListener.onItemClick(v, adapterPosition); }); viewHolder.postError.setOnClickListener(v -> { mItemClickListener.onReUpload(uplodFileState); }); } if (mItemLongClickListener != null) { viewHolder.itemView.setOnLongClickListener(v -> { int adapterPosition = viewHolder.getBindingAdapterPosition(); mItemLongClickListener.onItemLongClick(viewHolder, adapterPosition, v); return true; }); } } } /** * 更新进度 * * @param uplodFileState */ public void updateProgress(UplodFileState uplodFileState) { MyLog.d("updateProgress>>>" + "State:" + uplodFileState.getState() + ">>>position:" + uplodFileState.getAdapterPosition() + ">>>Progress: " + uplodFileState.getProgress()); // 更新进度参数 if (fileStates.containsKey(uplodFileState.getFilePath())) { // 获取已有的 UplodFileState 对象并更新进度 UplodFileState existingState = fileStates.get(uplodFileState.getFilePath()); int position = existingState.getAdapterPosition(); existingState.setState(uplodFileState.getState()); if (uplodFileState.getState() == 0) { existingState.setState(uplodFileState.getState()); existingState.setProgress(uplodFileState.getProgress()); // 更新进度 // 获取进度更新项的位置 } if (position != RecyclerView.NO_POSITION) { notifyItemChanged(position); } } } private OnItemClickListener mItemClickListener; public void setOnItemClickListener(OnItemClickListener l) { this.mItemClickListener = l; } public interface OnItemClickListener { /** * Item click event * * @param v * @param position */ void onItemClick(View v, int position); /** * Open PictureSelector */ void openPicture(); /** * 删除了某一个 * * @param position */ void onDeleteClick(int position); /** * 上传失败后重新上传 */ void onReUpload(UplodFileState uplodFileState); } private OnItemLongClickListener mItemLongClickListener; public void setItemLongClickListener(OnItemLongClickListener l) { this.mItemLongClickListener = l; } /** * 删除 */ public void delete(int position) { try { if (position != RecyclerView.NO_POSITION && list.size() > position) { list.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, list.size()); } } catch (Exception e) { e.printStackTrace(); } } public static class ViewHolder extends RecyclerView.ViewHolder { ImageView mImg; ImageView mIvDel; ImageView postError; TextView tvDuration; RelativeLayout maskLayerBg; CircleProgressView circleProgressView; public ViewHolder(View view) { super(view); mImg = view.findViewById(R.id.fiv); mIvDel = view.findViewById(R.id.iv_del); tvDuration = view.findViewById(R.id.tv_duration); circleProgressView = view.findViewById(R.id.cpv); maskLayerBg = view.findViewById(R.id.mask_layer_bg); postError = view.findViewById(R.id.postError); } } }