RecyclerView适配器+数据绑定 [英] RecyclerView Adapter + Data Binding

查看:142
本文介绍了RecyclerView适配器+数据绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,所以我试图在我的recyclerview适配器中实现数据绑定,并且我需要帮助,因为我不知道该怎么做?我正试图从我的recyclerview适配器中删除样板代码,这就是原因.在下面检查我的代码:

Okay so I'm trying to implement Data Binding in my recyclerview adapter, and I need help because I don't know how exactly? I'm trying to remove boilerplate code from my recyclerview adapter, that's why. Check my codes down bellow:

custom_row(Recyclerview项目布局)

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="toDoData"
            type="com.jovanovic.stefan.tododemo.data.ToDoData" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/rootLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="4dp">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/row_background"
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:background="@drawable/item_background"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <TextView
                android:id="@+id/title_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:layout_marginTop="16dp"
                android:text="@{toDoData.title}"
                android:textColor="@color/darkGray"
                android:textSize="20sp"
                android:textStyle="bold"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/description_txt"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="16dp"
                android:layout_marginBottom="16dp"
                android:maxLength="160"
                android:maxLines="3"
                android:text="@{toDoData.description}"
                android:textColor="@color/darkGray"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="@+id/title_txt"
                app:layout_constraintTop_toBottomOf="@+id/title_txt" />

        </androidx.constraintlayout.widget.ConstraintLayout>


    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

ToDoData

@Parcelize
@Entity(tableName = "todo_table")
data class ToDoData(
    @PrimaryKey(autoGenerate = true)
    var id: Int,
    var title: String,
    var priority: Int,
    var description: String
) : Parcelable

MyAdapter(Recyclerview适配器)

class MyAdapter: RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
       val view = LayoutInflater.from(parent.context).inflate(R.layout.custom_row, parent, false)
        return MyViewHolder(view)
    }

    override fun getItemCount(): Int {
        TODO("Not yet implemented")
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        TODO("Not yet implemented")
    }

}

推荐答案

您快到了.要完成您的实施,请遵循以下步骤.

You are almost there. To complete your implementation, follow the following.

在适配器中,创建将支持数据绑定的视图保持器.

In your adapter, create the view holder that will support data binding.

class ViewHolder private constructor(private val binding: CustomRowBinding)
        : RecyclerView.ViewHolder(binding.root) {

        fun bind(todo: ToDoData) {
            binding.todo = toDoData
            // make sure to include this so your view will be updated
            binding.executePendingBindings()
        }

        companion object {
            fun from(parent: ViewGroup): ViewHolder {
                val layoutInflater = LayoutInflater.from(parent.context)
                val binding = CustomRowBinding.inflate(layoutInflater, parent, false)

                return ViewHolder(binding)
            }
        }
    }

在您的oncreateViewHolder中

And in your oncreateViewHolder

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder.from(parent)
    }

最后是onBindViewHolder

And finally onBindViewHolder

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val todo = todoList[position] // this will be the list object you created
        holder.bind(todo)
    }

这篇关于RecyclerView适配器+数据绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆