Skip to content

Commit e124df5

Browse files
refactor(*): 优化EditableImageAdapter
1 parent 3b9899f commit e124df5

File tree

3 files changed

+90
-36
lines changed

3 files changed

+90
-36
lines changed

app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,6 @@ dependencies {
6363
implementation 'com.google.code.gson:gson:2.10.1'
6464
//网络请求和接口封装
6565
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
66+
//图片压缩
67+
implementation 'top.zibin:Luban:1.1.8'
6668
}
Lines changed: 74 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.pengxh.kt.lib.fragments.adapter
22

33
import android.os.Bundle
4+
import android.os.Handler
5+
import android.os.Message
46
import android.view.LayoutInflater
57
import android.view.View
68
import android.view.ViewGroup
9+
import androidx.lifecycle.lifecycleScope
710
import com.luck.picture.lib.basic.PictureSelector
811
import com.luck.picture.lib.config.SelectMimeType
912
import com.luck.picture.lib.entity.LocalMedia
@@ -13,18 +16,28 @@ import com.pengxh.kt.lib.utils.GlideLoadEngine
1316
import com.pengxh.kt.lite.adapter.EditableImageAdapter
1417
import com.pengxh.kt.lite.base.KotlinBaseFragment
1518
import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
19+
import com.pengxh.kt.lite.extensions.createCompressImageDir
1620
import com.pengxh.kt.lite.extensions.dp2px
1721
import com.pengxh.kt.lite.extensions.getScreenWidth
22+
import com.pengxh.kt.lite.utils.WeakReferenceHandler
23+
import kotlinx.coroutines.delay
24+
import kotlinx.coroutines.flow.flow
25+
import kotlinx.coroutines.launch
26+
import top.zibin.luban.Luban
27+
import top.zibin.luban.OnCompressListener
28+
import java.io.File
1829

19-
class EditableImageAdapterFragment : KotlinBaseFragment<FragmentAdapterEditableImageBinding>() {
30+
class EditableImageAdapterFragment : KotlinBaseFragment<FragmentAdapterEditableImageBinding>(),
31+
Handler.Callback {
2032

21-
private lateinit var editableImageAdapter: EditableImageAdapter
33+
private lateinit var imageAdapter: EditableImageAdapter
2234
private val marginOffset by lazy { 1.dp2px(requireContext()) }
35+
private val weakReferenceHandler by lazy { WeakReferenceHandler(this) }
2336
private val recyclerViewImages = ArrayList<String>()
37+
private val selectedImages = ArrayList<LocalMedia>()
2438

2539
override fun initViewBinding(
26-
inflater: LayoutInflater,
27-
container: ViewGroup?
40+
inflater: LayoutInflater, container: ViewGroup?
2841
): FragmentAdapterEditableImageBinding {
2942
return FragmentAdapterEditableImageBinding.inflate(inflater, container, false)
3043
}
@@ -34,21 +47,20 @@ class EditableImageAdapterFragment : KotlinBaseFragment<FragmentAdapterEditableI
3447
}
3548

3649
override fun initOnCreate(savedInstanceState: Bundle?) {
37-
editableImageAdapter =
38-
EditableImageAdapter(requireContext(), requireContext().getScreenWidth(), 9, 3, 1)
50+
val viewWidth = requireContext().getScreenWidth() - 100.dp2px(requireContext())
51+
imageAdapter = EditableImageAdapter(requireContext(), viewWidth, 9, 3)
3952
binding.recyclerView.addItemDecoration(
4053
RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset)
4154
)
42-
binding.recyclerView.adapter = editableImageAdapter
55+
binding.recyclerView.adapter = imageAdapter
4356
}
4457

4558
override fun observeRequestState() {
4659

4760
}
4861

4962
override fun initEvent() {
50-
editableImageAdapter.setOnItemClickListener(object :
51-
EditableImageAdapter.OnItemClickListener {
63+
imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
5264
override fun onAddImageClick() {
5365
selectPicture()
5466
}
@@ -58,29 +70,70 @@ class EditableImageAdapterFragment : KotlinBaseFragment<FragmentAdapterEditableI
5870
}
5971

6072
override fun onItemLongClick(view: View?, position: Int) {
61-
editableImageAdapter.deleteImage(position)
73+
selectedImages.removeAt(position)
74+
recyclerViewImages.removeAt(position)
75+
imageAdapter.notifyImageItemRemoved(recyclerViewImages)
6276
}
6377
})
6478
}
6579

6680
private fun selectPicture() {
67-
PictureSelector.create(this)
68-
.openGallery(SelectMimeType.ofImage())
69-
.isGif(false)
70-
.isMaxSelectEnabledMask(true)
71-
.setFilterMinFileSize(100)
72-
.setMaxSelectNum(9)
73-
.isDisplayCamera(false)
74-
.setImageEngine(GlideLoadEngine.get)
81+
PictureSelector.create(this).openGallery(SelectMimeType.ofImage()).isGif(false)
82+
.isMaxSelectEnabledMask(true).setFilterMinFileSize(100).setMaxSelectNum(9)
83+
.isDisplayCamera(false).setImageEngine(GlideLoadEngine.get)
84+
.setSelectedData(selectedImages)
7585
.forResult(object : OnResultCallbackListener<LocalMedia> {
7686
override fun onResult(result: ArrayList<LocalMedia>) {
77-
for (media in result) {
78-
recyclerViewImages.add(media.realPath)
87+
//重置已选的图片
88+
selectedImages.clear()
89+
//因为result会带着之前的数据,所以需要清空之前已经add的数据
90+
recyclerViewImages.clear()
91+
//数据链处理已选的图片
92+
lifecycleScope.launch {
93+
flow {
94+
result.forEach {
95+
emit(it)
96+
delay(1000)
97+
}
98+
}.collect {
99+
selectedImages.add(it)
100+
//压缩图片并上传
101+
Luban.with(context).load(it.realPath).ignoreBy(100)
102+
.setTargetDir(requireContext().createCompressImageDir().toString())
103+
.setCompressListener(object : OnCompressListener {
104+
override fun onStart() {
105+
106+
}
107+
108+
override fun onSuccess(file: File) {
109+
//模拟上传图片
110+
val message = weakReferenceHandler.obtainMessage()
111+
message.what = 2024042301
112+
message.obj = file
113+
weakReferenceHandler.sendMessageDelayed(message, 500)
114+
}
115+
116+
override fun onError(e: Throwable) {
117+
e.printStackTrace()
118+
}
119+
}).launch()
120+
}
79121
}
80-
editableImageAdapter.setupImage(recyclerViewImages)
122+
123+
81124
}
82125

83126
override fun onCancel() {}
84127
})
85128
}
129+
130+
override fun handleMessage(msg: Message): Boolean {
131+
if (msg.what == 2024042301) {
132+
val file = msg.obj as File
133+
134+
recyclerViewImages.add(file.absolutePath)
135+
imageAdapter.notifyImageItemRangeInserted(recyclerViewImages)
136+
}
137+
return true
138+
}
86139
}

lite/src/main/java/com/pengxh/kt/lite/adapter/EditableImageAdapter.kt

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,19 @@ class EditableImageAdapter(
2626
private val spanCount: Int
2727
) : RecyclerView.Adapter<ViewHolder>() {
2828

29-
private var images: MutableList<String> = ArrayList()
29+
private var adapterItems = ArrayList<String>()
3030

31-
fun setupImage(images: MutableList<String>) {
32-
this.images = images
33-
notifyItemRangeChanged(0, images.size)
31+
fun notifyImageItemRangeInserted(images: ArrayList<String>) {
32+
val previousSize = adapterItems.size
33+
adapterItems.clear()
34+
notifyItemRangeRemoved(0, previousSize)
35+
adapterItems.addAll(images)
36+
notifyItemRangeInserted(0, adapterItems.size)
3437
}
3538

36-
fun deleteImage(position: Int) {
37-
if (images.isNotEmpty()) {
38-
images.removeAt(position)
39-
/**
40-
* 发生变化的item数目
41-
* */
42-
notifyItemRangeRemoved(position, 1)
39+
fun notifyImageItemRemoved(images: ArrayList<String>) {
40+
if (adapterItems.isNotEmpty()) {
41+
notifyImageItemRangeInserted(images)
4342
}
4443
}
4544

@@ -55,13 +54,13 @@ class EditableImageAdapter(
5554
val params = LinearLayout.LayoutParams(imageSize, imageSize)
5655
imageView.layoutParams = params
5756

58-
if (position == itemCount - 1 && images.size < imageCountLimit) {
57+
if (position == itemCount - 1 && adapterItems.size < imageCountLimit) {
5958
imageView.setImageResource(R.drawable.ic_add_pic)
6059
imageView.setOnClickListener { //添加图片
6160
itemClickListener?.onAddImageClick()
6261
}
6362
} else {
64-
Glide.with(context).load(images[position]).into(imageView)
63+
Glide.with(context).load(adapterItems[position]).into(imageView)
6564
imageView.setOnClickListener { // 点击操作,查看大图
6665
itemClickListener?.onItemClick(holder.bindingAdapterPosition)
6766
}
@@ -73,10 +72,10 @@ class EditableImageAdapter(
7372
}
7473
}
7574

76-
override fun getItemCount(): Int = if (images.size >= imageCountLimit) {
75+
override fun getItemCount(): Int = if (adapterItems.size >= imageCountLimit) {
7776
imageCountLimit
7877
} else {
79-
images.size + 1
78+
adapterItems.size + 1
8079
}
8180

8281
private var itemClickListener: OnItemClickListener? = null

0 commit comments

Comments
 (0)