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