1
1
package com.pengxh.kt.lib.fragments.adapter
2
2
3
3
import android.os.Bundle
4
+ import android.os.Handler
5
+ import android.os.Message
4
6
import android.view.LayoutInflater
5
7
import android.view.View
6
8
import android.view.ViewGroup
9
+ import androidx.lifecycle.lifecycleScope
7
10
import com.luck.picture.lib.basic.PictureSelector
8
11
import com.luck.picture.lib.config.SelectMimeType
9
12
import com.luck.picture.lib.entity.LocalMedia
@@ -13,18 +16,28 @@ import com.pengxh.kt.lib.utils.GlideLoadEngine
13
16
import com.pengxh.kt.lite.adapter.EditableImageAdapter
14
17
import com.pengxh.kt.lite.base.KotlinBaseFragment
15
18
import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
19
+ import com.pengxh.kt.lite.extensions.createCompressImageDir
16
20
import com.pengxh.kt.lite.extensions.dp2px
17
21
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
18
29
19
- class EditableImageAdapterFragment : KotlinBaseFragment <FragmentAdapterEditableImageBinding >() {
30
+ class EditableImageAdapterFragment : KotlinBaseFragment <FragmentAdapterEditableImageBinding >(),
31
+ Handler .Callback {
20
32
21
- private lateinit var editableImageAdapter : EditableImageAdapter
33
+ private lateinit var imageAdapter : EditableImageAdapter
22
34
private val marginOffset by lazy { 1 .dp2px(requireContext()) }
35
+ private val weakReferenceHandler by lazy { WeakReferenceHandler (this ) }
23
36
private val recyclerViewImages = ArrayList <String >()
37
+ private val selectedImages = ArrayList <LocalMedia >()
24
38
25
39
override fun initViewBinding (
26
- inflater : LayoutInflater ,
27
- container : ViewGroup ?
40
+ inflater : LayoutInflater , container : ViewGroup ?
28
41
): FragmentAdapterEditableImageBinding {
29
42
return FragmentAdapterEditableImageBinding .inflate(inflater, container, false )
30
43
}
@@ -34,21 +47,20 @@ class EditableImageAdapterFragment : KotlinBaseFragment<FragmentAdapterEditableI
34
47
}
35
48
36
49
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 )
39
52
binding.recyclerView.addItemDecoration(
40
53
RecyclerViewItemOffsets (marginOffset, marginOffset, marginOffset, marginOffset)
41
54
)
42
- binding.recyclerView.adapter = editableImageAdapter
55
+ binding.recyclerView.adapter = imageAdapter
43
56
}
44
57
45
58
override fun observeRequestState () {
46
59
47
60
}
48
61
49
62
override fun initEvent () {
50
- editableImageAdapter.setOnItemClickListener(object :
51
- EditableImageAdapter .OnItemClickListener {
63
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter .OnItemClickListener {
52
64
override fun onAddImageClick () {
53
65
selectPicture()
54
66
}
@@ -58,29 +70,70 @@ class EditableImageAdapterFragment : KotlinBaseFragment<FragmentAdapterEditableI
58
70
}
59
71
60
72
override fun onItemLongClick (view : View ? , position : Int ) {
61
- editableImageAdapter.deleteImage(position)
73
+ selectedImages.removeAt(position)
74
+ recyclerViewImages.removeAt(position)
75
+ imageAdapter.notifyImageItemRemoved(recyclerViewImages)
62
76
}
63
77
})
64
78
}
65
79
66
80
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)
75
85
.forResult(object : OnResultCallbackListener <LocalMedia > {
76
86
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
+ }
79
121
}
80
- editableImageAdapter.setupImage(recyclerViewImages)
122
+
123
+
81
124
}
82
125
83
126
override fun onCancel () {}
84
127
})
85
128
}
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
+ }
86
139
}
0 commit comments