当前位置: 首页 > article >正文

Kotlin中使用DataBinding绑定RecyclerView并数据两列显示

 1.RecyclerView列表

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

 2.item布局

说明:在xml中import数据实体类DeviceData,可以直接取数据对控件进行内容填充

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <import type="android.view.View"/>
        <import type="com.example.DeviceData" alias="DeviceData"/>
        <variable
            name="deviceData"
            type="DeviceData" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/lib_title_bg"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/tv_item_device_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="15sp"
                android:layout_weight="1"
                android:text="@{deviceData.deviceName}"
                android:padding="10dp"/>
            <TextView
                android:id="@+id/tv_item_device_model"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="15sp"
                android:layout_weight="1"
                android:text="@{deviceData.deviceModelName}"
                android:padding="10dp"/>
        </LinearLayout>
        <View
            android:layout_width="match_parent"
            android:background="#F7F7F7"
            android:layout_height="15dp"/>
    </LinearLayout>
</layout>

 3.adapter适配器

说明:适配器中使用dataBinding进行数据绑定,代码简洁

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.orhanobut.logger.Logger
import com.example.R
import com.example.databinding.ItemDeviceListBinding
import com.example.DeviceData

class DeviceListAdapter(
    val context: Context,
    var data: ArrayList<DeviceData>,
    val onItemClick: (Int) -> Unit,
): RecyclerView.Adapter<ViewHolder>() {
    lateinit var itemBinding: ItemDeviceListBinding
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        itemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context),R.layout.item_device_list, parent, false)
        return ItemViewHolder(itemBinding,itemBinding.root)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        (holder as ItemViewHolder).bind(data[position])
        holder.itemView.setOnClickListener(View.OnClickListener {
            onItemClick(position)
        })
    }

    override fun getItemCount(): Int {
        return data.size
    }
    fun refreshList(list: ArrayList<DeviceData>, choose: Int){
        if (choose==0){
            data.clear()
        }
        data.addAll(list)
        notifyDataSetChanged()
    }
    class ItemViewHolder(val itemBind: ItemDeviceListBinding,view: View): RecyclerView.ViewHolder(view){
        fun bind(bean: DeviceData){
            itemBind.deviceData = bean
        }
    }
}

 4.分隔线

import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.RecyclerView
//分隔线
class GridSpacingItemDecoration(
    private val spanCount: Int,
    private val spacing: Int,
    private val includeEdge: Boolean
) : RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        val position = parent.getChildAdapterPosition(view)
        val column = position % spanCount

        if (includeEdge) {
            outRect.left = spacing - column * spacing / spanCount
            outRect.right = (column + 1) * spacing / spanCount

            if (position < spanCount) {
                outRect.top = spacing
            }
            outRect.bottom = spacing
        } else {
            outRect.left = column * spacing / spanCount
            outRect.right = spacing - (column + 1) * spacing / spanCount
            if (position >= spanCount) {
                outRect.top = spacing
            }
        }
    }
}

 5.使用

var adapter = DeviceListAdapter(requireContext(),dataList){
	println("点击事件")
}
val rv_list: RecyclerView = findViewById(R.id.rv_list)
rv_list.layoutManager = GridLayoutManager(context, 2)//数据两列显示
rv_list.addItemDecoration(GridSpacingItemDecoration(2, 10, true))//数据间分隔线
rv_list.adapter = adapter


http://www.kler.cn/a/583944.html

相关文章:

  • 【vue+excel】导出excel(目前是可以导出两个sheet)
  • 【C#学习笔记04】C语言格式化输出
  • Gartner发布中国CIO和安全团队生成式AI指南:制定人工智能安全治理计划的五个阶段
  • 江科大51单片机笔记【15】直流电机驱动(PWM)
  • 【测试开发面试题】每日 3 题(十一)
  • 星越L_发动机舱开启及油液加注讲解
  • matlab:二维绘图篇——plot绘图命令
  • Java中如何去自定义一个类加载器
  • SQL Server查询优化
  • Axure设计之下拉多选框制作教程C(中继器)
  • 【MySQL 中 `TINYINT` 类型与布尔值的关系】
  • 宇树人形机器人开源模型
  • 【一键让照片动起来】阿里万相2.1图生视频+蓝耘智算零门槛部署指南
  • 正则应用--java算法
  • 【Java项目】基于JSP的咨询交流论坛系统
  • 用 Python 检测两个文本文件的相似性的几种方法
  • 人工智能混合编程实践:Python ONNX进行图像超分重建
  • 【探秘机器人:从当下到未来的科技跃迁】
  • VSCode集成C语言开发环境
  • 八叉树地图的原理与实现