Skip to content

Commit a99ba91

Browse files
feat(*): 添加RecyclerView多选列表通用适配器
1 parent 70103af commit a99ba91

File tree

3 files changed

+119
-42
lines changed

3 files changed

+119
-42
lines changed

app/src/main/java/com/pengxh/kt/lib/MainActivity.kt

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import androidx.recyclerview.widget.DefaultItemAnimator
55
import androidx.recyclerview.widget.DividerItemDecoration
66
import com.google.gson.Gson
77
import com.google.gson.reflect.TypeToken
8-
import com.pengxh.kt.lite.adapter.SingleChoiceAdapter
8+
import com.pengxh.kt.lite.adapter.MultipleChoiceAdapter
99
import com.pengxh.kt.lite.adapter.ViewHolder
1010
import com.pengxh.kt.lite.base.KotlinBaseActivity
1111
import com.pengxh.kt.lite.extensions.readAssetsFile
12+
import com.pengxh.kt.lite.extensions.toJson
1213
import kotlinx.android.synthetic.main.activity_main.*
1314

1415

@@ -66,27 +67,60 @@ class MainActivity : KotlinBaseActivity() {
6667
/**
6768
* 单选
6869
* */
69-
val singleChoiceAdapter = object : SingleChoiceAdapter<SampleListModel.DataModel.RowsModel>(
70-
R.layout.item_select_sample_lv, models
71-
) {
72-
override fun convertView(
73-
viewHolder: ViewHolder, position: Int, item: SampleListModel.DataModel.RowsModel
70+
// val singleChoiceAdapter = object : SingleChoiceAdapter<SampleListModel.DataModel.RowsModel>(
71+
// R.layout.item_select_sample_lv, models
72+
// ) {
73+
// override fun convertView(
74+
// viewHolder: ViewHolder, position: Int, item: SampleListModel.DataModel.RowsModel
75+
// ) {
76+
// viewHolder.setText(R.id.sampleNameView, "${item.sampleName}【${item.sampleModel}】")
77+
// .setText(R.id.manufacturingCodeView, "出厂编号:${item.manufacturingNo}")
78+
// .setText(R.id.sampleCodeView, "样品编号:${item.sampleNo}")
79+
// .setText(R.id.validDateView, "有效期至:${item.validDeadline}")
80+
// }
81+
// }
82+
// recyclerView.addItemDecoration(
83+
// DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
84+
// )
85+
// (recyclerView.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
86+
// recyclerView.adapter = singleChoiceAdapter
87+
// singleChoiceAdapter.setOnCheckedListener(object :
88+
// SingleChoiceAdapter.OnItemCheckedListener<SampleListModel.DataModel.RowsModel> {
89+
// override fun onItemChecked(position: Int, t: SampleListModel.DataModel.RowsModel) {
90+
// Log.d(kTag, t.id)
91+
// }
92+
// })
93+
94+
/**
95+
* 多选
96+
* */
97+
val multipleChoiceAdapter =
98+
object : MultipleChoiceAdapter<SampleListModel.DataModel.RowsModel>(
99+
R.layout.item_select_sample_lv, models
74100
) {
75-
viewHolder.setText(R.id.sampleNameView, "${item.sampleName}${item.sampleModel}")
76-
.setText(R.id.manufacturingCodeView, "出厂编号:${item.manufacturingNo}")
77-
.setText(R.id.sampleCodeView, "样品编号:${item.sampleNo}")
78-
.setText(R.id.validDateView, "有效期至:${item.validDeadline}")
101+
override fun convertView(
102+
viewHolder: ViewHolder, position: Int, item: SampleListModel.DataModel.RowsModel
103+
) {
104+
viewHolder.setText(
105+
R.id.sampleNameView,
106+
"${item.sampleName}${item.sampleModel}"
107+
)
108+
.setText(R.id.manufacturingCodeView, "出厂编号:${item.manufacturingNo}")
109+
.setText(R.id.sampleCodeView, "样品编号:${item.sampleNo}")
110+
.setText(R.id.validDateView, "有效期至:${item.validDeadline}")
111+
}
79112
}
80-
}
81113
recyclerView.addItemDecoration(
82114
DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
83115
)
84116
(recyclerView.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
85-
recyclerView.adapter = singleChoiceAdapter
86-
singleChoiceAdapter.setOnCheckedListener(object :
87-
SingleChoiceAdapter.OnItemCheckedListener<SampleListModel.DataModel.RowsModel> {
88-
override fun onItemChecked(position: Int, t: SampleListModel.DataModel.RowsModel) {
89-
Log.d(kTag, t.id)
117+
recyclerView.adapter = multipleChoiceAdapter
118+
multipleChoiceAdapter.setOnCheckedListener(object :
119+
MultipleChoiceAdapter.OnItemCheckedListener<SampleListModel.DataModel.RowsModel> {
120+
override fun onItemChecked(
121+
position: Int, items: ArrayList<SampleListModel.DataModel.RowsModel>
122+
) {
123+
Log.d("Casic", "MainActivity => onItemChecked: ${items.toJson()}")
90124
}
91125
})
92126
}

lite/build.gradle

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-android-extensions'
44

55
android {
6-
compileSdkVersion 30
6+
compileSdkVersion 31
7+
buildToolsVersion "30.0.3"
78

89
defaultConfig {
910
minSdkVersion 23
10-
targetSdkVersion 30
11+
targetSdkVersion 31
1112
versionCode 1
1213
versionName "1.0"
1314

@@ -21,10 +22,10 @@ android {
2122
}
2223
}
2324

24-
compileOptions {
25-
sourceCompatibility JavaVersion.VERSION_1_8
26-
targetCompatibility JavaVersion.VERSION_1_8
27-
}
25+
// compileOptions {
26+
// sourceCompatibility JavaVersion.VERSION_1_8
27+
// targetCompatibility JavaVersion.VERSION_1_8
28+
// }
2829

2930
kotlin {
3031
experimental {
@@ -40,20 +41,26 @@ dependencies {
4041
implementation "androidx.recyclerview:recyclerview:1.2.1"
4142
implementation 'io.reactivex:rxjava:1.3.8'
4243
implementation 'io.reactivex:rxandroid:1.2.1'
43-
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
44-
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
44+
implementation 'com.squareup.retrofit2:adapter-rxjava:2.8.1'
45+
//返回值转换器
4546
implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
4647
implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
47-
implementation 'com.squareup.retrofit2:adapter-rxjava:2.8.1'
48-
implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
4948
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
49+
//网络请求和接口封装
50+
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
51+
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
52+
//okhttp3日志拦截器
53+
implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
54+
//图片加载
5055
implementation 'com.github.bumptech.glide:glide:4.9.0'
56+
//官方Json解析库
5157
implementation 'com.google.code.gson:gson:2.9.0'
5258
//高德导航、定位、地图三合一
5359
implementation 'com.amap.api:navi-3dmap:latest.integration'
5460
//Kotlin协程
55-
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1'
56-
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1'
61+
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
62+
//MVVM+LiveData
63+
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
5764
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
5865
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
5966
}
Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,55 @@
11
package com.pengxh.kt.lite.adapter
22

3+
import android.view.LayoutInflater
4+
import android.view.ViewGroup
5+
import androidx.annotation.LayoutRes
6+
import androidx.recyclerview.widget.RecyclerView
7+
38
/**
49
* RecyclerView多选适配器
510
*/
6-
//class MultipleChoiceAdapter(context: Context, private val dataRows: MutableList<T>) :
7-
// RecyclerView.Adapter<MultipleChoiceAdapter.ItemViewHolder> {
8-
//
9-
//
10-
// private var itemCheckedListener: OnItemCheckedListener? = null
11-
//
12-
// interface OnItemCheckedListener {
13-
// fun onItemChecked(view: View, items: ArrayList<T>)
14-
// }
15-
//
16-
// fun setOnCheckedListener(listener: OnItemCheckedListener?) {
17-
// itemCheckedListener = listener
18-
// }
19-
//}
11+
abstract class MultipleChoiceAdapter<T>(
12+
@LayoutRes private val xmlResource: Int, private val dataRows: List<T>
13+
) : RecyclerView.Adapter<ViewHolder>() {
14+
15+
private val kTag = "MultipleChoiceAdapter"
16+
private var multipleSelected = mutableSetOf<Int>()
17+
private var selectedItems = ArrayList<T>()
18+
19+
override fun getItemCount(): Int = dataRows.size
20+
21+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(
22+
LayoutInflater.from(parent.context).inflate(xmlResource, parent, false)
23+
)
24+
25+
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
26+
convertView(holder, position, dataRows[position])
27+
28+
holder.itemView.isSelected = multipleSelected.contains(position)
29+
holder.itemView.setOnClickListener {
30+
if (multipleSelected.contains(position)) {
31+
multipleSelected.remove(position)
32+
selectedItems.remove(dataRows[position])
33+
holder.itemView.isSelected = false
34+
} else {
35+
multipleSelected.add(position)
36+
selectedItems.add(dataRows[position])
37+
holder.itemView.isSelected = true
38+
}
39+
40+
itemCheckedListener?.onItemChecked(position, selectedItems)
41+
}
42+
}
43+
44+
abstract fun convertView(viewHolder: ViewHolder, position: Int, item: T)
45+
46+
private var itemCheckedListener: OnItemCheckedListener<T>? = null
47+
48+
interface OnItemCheckedListener<T> {
49+
fun onItemChecked(position: Int, items: ArrayList<T>)
50+
}
51+
52+
fun setOnCheckedListener(listener: OnItemCheckedListener<T>?) {
53+
itemCheckedListener = listener
54+
}
55+
}

0 commit comments

Comments
 (0)