Android Kotlin RecyclerView 使用
  uIgKgA3TQcA0 2023年11月25日 32 0

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)
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: java流没关的后果 下一篇: java生成ftp txt
  1. 分享:
最后一次编辑于 2023年11月25日 0

暂无评论

推荐阅读
uIgKgA3TQcA0