Skip to content

Commit 3b9899f

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

File tree

2 files changed

+22
-28
lines changed

2 files changed

+22
-28
lines changed

app/src/main/java/com/pengxh/kt/lib/fragments/adapter/EditableImageAdapterFragment.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ import com.pengxh.kt.lib.databinding.FragmentAdapterEditableImageBinding
1212
import com.pengxh.kt.lib.utils.GlideLoadEngine
1313
import com.pengxh.kt.lite.adapter.EditableImageAdapter
1414
import com.pengxh.kt.lite.base.KotlinBaseFragment
15+
import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
16+
import com.pengxh.kt.lite.extensions.dp2px
17+
import com.pengxh.kt.lite.extensions.getScreenWidth
1518

1619
class EditableImageAdapterFragment : KotlinBaseFragment<FragmentAdapterEditableImageBinding>() {
1720

1821
private lateinit var editableImageAdapter: EditableImageAdapter
22+
private val marginOffset by lazy { 1.dp2px(requireContext()) }
1923
private val recyclerViewImages = ArrayList<String>()
2024

2125
override fun initViewBinding(
@@ -30,15 +34,19 @@ class EditableImageAdapterFragment : KotlinBaseFragment<FragmentAdapterEditableI
3034
}
3135

3236
override fun initOnCreate(savedInstanceState: Bundle?) {
33-
editableImageAdapter = EditableImageAdapter(requireContext(), 9, 1)
37+
editableImageAdapter =
38+
EditableImageAdapter(requireContext(), requireContext().getScreenWidth(), 9, 3, 1)
39+
binding.recyclerView.addItemDecoration(
40+
RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset)
41+
)
42+
binding.recyclerView.adapter = editableImageAdapter
3443
}
3544

3645
override fun observeRequestState() {
3746

3847
}
3948

4049
override fun initEvent() {
41-
binding.recyclerView.adapter = editableImageAdapter
4250
editableImageAdapter.setOnItemClickListener(object :
4351
EditableImageAdapter.OnItemClickListener {
4452
override fun onAddImageClick() {

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

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,23 @@ import android.widget.LinearLayout
99
import androidx.recyclerview.widget.RecyclerView
1010
import com.bumptech.glide.Glide
1111
import com.pengxh.kt.lite.R
12-
import com.pengxh.kt.lite.extensions.dp2px
13-
import com.pengxh.kt.lite.extensions.getScreenWidth
1412

1513

1614
/**
1715
* 数量可编辑图片适配器
1816
*
19-
* @param imageCountLimit 最多显示几张图片,每行3张图片
20-
* @param spacing 上下左右外边距,无需在 [androidx.recyclerview.widget.RecyclerView] 设置边距
17+
* @param context 使用适配的上下文
18+
* @param viewWidth RecyclerView实际宽度,一般情况下就是屏幕宽度,但是如果有其他控件和它在同一行,需要计算实际宽度,不然无法正确显示RecyclerView item的布局
19+
* @param imageCountLimit 最多显示的图片数目
20+
* @param spanCount 每行显示的图片数目
2121
* */
2222
class EditableImageAdapter(
23-
private val context: Context, private val imageCountLimit: Int, private val spacing: Int
23+
private val context: Context,
24+
private val viewWidth: Int,
25+
private val imageCountLimit: Int,
26+
private val spanCount: Int
2427
) : RecyclerView.Adapter<ViewHolder>() {
2528

26-
private val screenWidth by lazy { context.getScreenWidth() }
2729
private var images: MutableList<String> = ArrayList()
2830

2931
fun setupImage(images: MutableList<String>) {
@@ -49,7 +51,10 @@ class EditableImageAdapter(
4951

5052
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
5153
val imageView = holder.getView<ImageView>(R.id.imageView)
52-
configImageParams(imageView, holder.bindingAdapterPosition)
54+
val imageSize = viewWidth / spanCount
55+
val params = LinearLayout.LayoutParams(imageSize, imageSize)
56+
imageView.layoutParams = params
57+
5358
if (position == itemCount - 1 && images.size < imageCountLimit) {
5459
imageView.setImageResource(R.drawable.ic_add_pic)
5560
imageView.setOnClickListener { //添加图片
@@ -68,25 +73,6 @@ class EditableImageAdapter(
6873
}
6974
}
7075

71-
private fun configImageParams(imageView: ImageView, position: Int) {
72-
val temp = spacing.dp2px(context)
73-
val imageSize = (screenWidth - temp * 3) / 3
74-
75-
val params = LinearLayout.LayoutParams(imageSize, imageSize)
76-
when (position) {
77-
0 -> params.setMargins(temp, temp, temp shr 1, temp shr 1)
78-
1 -> params.setMargins(temp shr 1, temp, temp shr 1, temp shr 1)
79-
2 -> params.setMargins(temp shr 1, temp, temp, temp shr 1)
80-
3 -> params.setMargins(temp, temp shr 1, temp shr 1, temp shr 1)
81-
4 -> params.setMargins(temp shr 1, temp shr 1, temp shr 1, temp shr 1)
82-
5 -> params.setMargins(temp shr 1, temp shr 1, temp, temp shr 1)
83-
6 -> params.setMargins(temp, temp shr 1, temp shr 1, temp)
84-
7 -> params.setMargins(temp shr 1, temp shr 1, temp shr 1, temp)
85-
8 -> params.setMargins(temp shr 1, temp shr 1, temp, temp)
86-
}
87-
imageView.layoutParams = params
88-
}
89-
9076
override fun getItemCount(): Int = if (images.size >= imageCountLimit) {
9177
imageCountLimit
9278
} else {

0 commit comments

Comments
 (0)