1.新建RecyclerView控件
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
2.自定义RecyclerView布局recycler_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
style="@style/configTextView" />
<LinearLayout style="@style/configLinearLayout">
<Button
android:id="@+id/btn_set"
style="@style/configButton"
android:text="@string/set_other_config" />
<EditText
android:id="@+id/et_set"
style="@style/configEditText" />
</LinearLayout>
<LinearLayout style="@style/configLinearLayout">
<Button
android:id="@+id/btn_get"
style="@style/configButton"
android:text="@string/get_other_config" />
<TextView
android:id="@+id/tv_get"
style="@style/configTextViewGet" />
</LinearLayout>
</LinearLayout>
< -- 所需要的style --/>
<style name="configLinearLayout">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginHorizontal" tools:ignore="NewApi">20dp</item>
<item name="android:gravity">center</item>
<item name="android:orientation">horizontal</item>
</style>
<style name="configTextView">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">match_parent</item>
<item name="android:textSize">40dp</item>
<item name="android:layout_marginTop">20dp</item>
</style>
<style name="configButton">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_weight">1</item>
<item name="android:textSize">40dp</item>
<item name="android:layout_marginRight">40dp</item>
</style>
<style name="configEditText">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_weight">3</item>
<item name="android:textSize">40dp</item>
</style>
<style name="configTextViewGet">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_weight">3</item>
<item name="android:textSize">40dp</item>
</style>
3.新建数据集
class ConfigData(
var configTitle: String, // 标题
var enable: Boolean, // 是否可点击
var persist: String, // 属性名称
var setValue: String, // 设置属性值
var getValue: String // 获取属性值
)
4.新建适配器
class ConfigAdapt(
var configList: List<ConfigData>,
var mViewModel: OtherConfigViewModel
) :
RecyclerView.Adapter<ConfigAdapt.ViewHolder>() {
lateinit var viewHolder:ViewHolder
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var configTitile: TextView = view.findViewById(R.id.tv_title)
var btn_set: Button = view.findViewById(R.id.btn_set)
var et_set: EditText = view.findViewById(R.id.et_set)
var btn_get: Button = view.findViewById(R.id.btn_get)
var tv_get: TextView = view.findViewById(R.id.tv_get)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view =
LayoutInflater.from(parent.context).inflate(R.layout.recycler_list, parent, false)
viewHolder = ViewHolder(view)
viewHolder.setIsRecyclable(false)
return viewHolder
}
override fun getItemCount(): Int {
return configList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
var config = configList[position]
holder.configTitile.text = config.configTitle
holder.btn_set.isEnabled = config.enable
holder.btn_get.isEnabled = config.enable
holder.et_set.setText(config.setValue)
holder.tv_get.text = config.getValue
holder.btn_set.setOnClickListener {
var value = holder.et_set.text.toString()
config.setValue = value //填充设置属性值
mViewModel.setAdaptConfig(position, value)
}
holder.btn_get.setOnClickListener {
mViewModel.getAdaptConfig(position)
}
}
}
fun getAdaptConfig(position: Int){
...
configDataList[position].getValue = it //填充获取属性值
_adaptOtherConfigLiveData.postValue(position)
}
5.加载控件以及适配器
lateinit var adapter: ConfigAdapt
var configDataList: ArrayList<ConfigData> = ArrayList() // 数据集合
var recyclerview = findViewById<RecyclerView>(R.id.recyclerview)
recyclerview.layoutManager = LinearLayoutManager(this)
adapter = ConfigAdapt(mViewModel.configDataList, mViewModel)
recyclerview.adapter = adapter
recyclerview.invalidateItemDecorations()
val configTitles = resources.getStringArray(R.array.configTitle)
val configEnable = resources.getStringArray(R.array.configEnable)
// 填充数据集合
for (i in configTitles.indices) {
mViewModel.configDataList.add(
ConfigData(
configTitles[i],
configEnable[i].toBoolean(),
mViewModel.persists[i],
"",
""
)
)
}
<array name="configTitle" translatable="false">
<item>@string/serialno</item>
<item>@string/partno</item>
<item>@string/ihuid</item>
<item>@string/xdsn</item>
<item>@string/vin</item>
<item>@string/sn</item>
<item>@string/vehicle</item>
<item>@string/supplier_code</item>
<item>@string/project_code</item>
<item>@string/year</item>
<item>@string/part</item>
<item>@string/operator</item>
</array>
<array name="configEnable" translatable="false" >
<item>"true"</item>
<item>"true"</item>
<item>"true"</item>
<item>"true"</item>
<item>"true"</item>
<item>"true"</item>
<item>"true"</item>
<item>"true"</item>
<item>"true"</item>
<item>"false"</item>
<item>"false"</item>
<item>"false"</item>
</array>
6.获取值发生变化时刷新布局
mViewModel.adaptOtherConfigLiveData.observe(this) {
adapter.notifyItemChanged(it,adapter.viewHolder.tv_get)
}