diff --git a/app/src/main/java/com/casic/br/app/adapter/EditableImageAdapter.kt b/app/src/main/java/com/casic/br/app/adapter/EditableImageAdapter.kt index 41e3603..8feefff 100644 --- a/app/src/main/java/com/casic/br/app/adapter/EditableImageAdapter.kt +++ b/app/src/main/java/com/casic/br/app/adapter/EditableImageAdapter.kt @@ -27,19 +27,20 @@ ) : RecyclerView.Adapter() { private val kTag = "EditableImageAdapter" - private var images: MutableList = ArrayList() + private var adapterItems = ArrayList() - fun setupImage(images: MutableList) { - this.images = images + fun notifyImageItemRangeInserted(images: ArrayList) { + val previousSize = adapterItems.size + adapterItems.clear() + notifyItemRangeRemoved(0, previousSize) + adapterItems.addAll(images) + notifyItemRangeInserted(0, adapterItems.size) } - fun deleteImage(position: Int) { - if (images.isNotEmpty()) { - images.removeAt(position) - /** - * 发生变化的item数目 - * */ - notifyItemRangeRemoved(position, 1) + fun notifyImageItemRemoved(images: ArrayList) { + if (adapterItems.isNotEmpty()) { + //因为外部数据已经发生变化,直接添加已经变化了的数据即可做到数据同步 + notifyImageItemRangeInserted(images) } } @@ -55,13 +56,13 @@ val params = LinearLayout.LayoutParams(imageSize, imageSize) imageView.layoutParams = params - if (position == itemCount - 1 && images.size < imageCountLimit) { + if (position == itemCount - 1 && adapterItems.size < imageCountLimit) { imageView.setImageResource(R.drawable.ic_add_pic) imageView.setOnClickListener { //添加图片 itemClickListener?.onAddImageClick() } } else { - Glide.with(context).load(images[position]).into(imageView) + Glide.with(context).load(adapterItems[position]).into(imageView) imageView.setOnClickListener { // 点击操作,查看大图 itemClickListener?.onItemClick(holder.bindingAdapterPosition) } @@ -73,10 +74,10 @@ } } - override fun getItemCount(): Int = if (images.size >= imageCountLimit) { + override fun getItemCount(): Int = if (adapterItems.size >= imageCountLimit) { imageCountLimit } else { - images.size + 1 + adapterItems.size + 1 } private var itemClickListener: OnItemClickListener? = null diff --git a/app/src/main/java/com/casic/br/app/adapter/EditableImageAdapter.kt b/app/src/main/java/com/casic/br/app/adapter/EditableImageAdapter.kt index 41e3603..8feefff 100644 --- a/app/src/main/java/com/casic/br/app/adapter/EditableImageAdapter.kt +++ b/app/src/main/java/com/casic/br/app/adapter/EditableImageAdapter.kt @@ -27,19 +27,20 @@ ) : RecyclerView.Adapter() { private val kTag = "EditableImageAdapter" - private var images: MutableList = ArrayList() + private var adapterItems = ArrayList() - fun setupImage(images: MutableList) { - this.images = images + fun notifyImageItemRangeInserted(images: ArrayList) { + val previousSize = adapterItems.size + adapterItems.clear() + notifyItemRangeRemoved(0, previousSize) + adapterItems.addAll(images) + notifyItemRangeInserted(0, adapterItems.size) } - fun deleteImage(position: Int) { - if (images.isNotEmpty()) { - images.removeAt(position) - /** - * 发生变化的item数目 - * */ - notifyItemRangeRemoved(position, 1) + fun notifyImageItemRemoved(images: ArrayList) { + if (adapterItems.isNotEmpty()) { + //因为外部数据已经发生变化,直接添加已经变化了的数据即可做到数据同步 + notifyImageItemRangeInserted(images) } } @@ -55,13 +56,13 @@ val params = LinearLayout.LayoutParams(imageSize, imageSize) imageView.layoutParams = params - if (position == itemCount - 1 && images.size < imageCountLimit) { + if (position == itemCount - 1 && adapterItems.size < imageCountLimit) { imageView.setImageResource(R.drawable.ic_add_pic) imageView.setOnClickListener { //添加图片 itemClickListener?.onAddImageClick() } } else { - Glide.with(context).load(images[position]).into(imageView) + Glide.with(context).load(adapterItems[position]).into(imageView) imageView.setOnClickListener { // 点击操作,查看大图 itemClickListener?.onItemClick(holder.bindingAdapterPosition) } @@ -73,10 +74,10 @@ } } - override fun getItemCount(): Int = if (images.size >= imageCountLimit) { + override fun getItemCount(): Int = if (adapterItems.size >= imageCountLimit) { imageCountLimit } else { - images.size + 1 + adapterItems.size + 1 } private var itemClickListener: OnItemClickListener? = null diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index e43d26e..7311844 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -32,6 +32,7 @@ class AddHiddenTroubleActivity : KotlinBaseActivity() { private val kTag = "AddHiddenTroubleActivity" + private val context = this private val selectedImages = ArrayList() private val imagePaths = ArrayList() private val recyclerViewImages = ArrayList() @@ -61,16 +62,14 @@ if (it.code == 200) { val url = it.data.toString() imagePaths.add(url) - recyclerViewImages.add(url.combineFilePath()) - imageAdapter.notifyDataSetChanged() + imageAdapter.notifyImageItemRangeInserted(recyclerViewImages) } } //左外边距,左内边距,TextView宽度,内间距,右内边距,右外边距 val viewWidth = getScreenWidth() - (15 + 15 + 65 + 10 + 15 + 15).dp2px(this) imageAdapter = EditableImageAdapter(this, viewWidth, 3, 3) - imageAdapter.setupImage(recyclerViewImages) binding.recyclerView.addItemDecoration( RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) ) @@ -88,8 +87,9 @@ } override fun onItemLongClick(view: View?, position: Int) { - imageAdapter.deleteImage(position) selectedImages.removeAt(position) + recyclerViewImages.removeAt(position) + imageAdapter.notifyImageItemRemoved(recyclerViewImages) } }) @@ -107,8 +107,13 @@ .setSelectedData(selectedImages) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList) { + //重置已选的图片 + selectedImages.clear() + //因为result会带着之前的数据,所以需要清空之前已经add的数据 + recyclerViewImages.clear() + imagePaths.clear() // 如果设置了setSelectedData,它会将之前的结果作为最新的返回值,要注意重复问题 - // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + // 数据链控制图片压缩上传过程,防止速度过快导致压缩失败 lifecycleScope.launch { flow { result.forEach { @@ -117,7 +122,23 @@ } }.collect { selectedImages.add(it) - compressImage(it) + //压缩图片并上传 + Luban.with(context).load(it.realPath).ignoreBy(100) + .setTargetDir(createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + //上传图片 + imageFileViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }).launch() } } } @@ -125,27 +146,4 @@ override fun onCancel() {} }) } - - /** - * 压缩图片并上传 - * */ - private fun compressImage(result: LocalMedia) { - //压缩图片 - Luban.with(this).load(result.realPath).ignoreBy(100) - .setTargetDir(createCompressImageDir().toString()) - .setCompressListener(object : OnCompressListener { - override fun onStart() { - - } - - override fun onSuccess(file: File) { - //上传图片 - imageFileViewModel.uploadImage(file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }).launch() - } } \ No newline at end of file