簡體   English   中英

RecyclerView 適配器 + 數據綁定

[英]RecyclerView Adapter + Data Binding

好的,所以我正在嘗試在我的 recyclerview 適配器中實現數據綁定,我需要幫助,因為我不知道具體如何? 我正在嘗試從我的 recyclerview 適配器中刪除樣板代碼,這就是原因。 在下面檢查我的代碼:

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>

待辦事項數據

@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")
    }

}

你快到了。 要完成您的實施,請執行以下操作。

在您的適配器中,創建將支持數據綁定的視圖持有者。

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

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

最后是 onBindViewHolder

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

你可以試試SmartRecyclerView

smartRecyclerView = findViewById(R.id.smartRecyclerView)
smartRecyclerView.apply{
        initSmartRecyclerView(activity = this,smartRecyclerViewListener = smartRecyclerViewListener,isPaginated = true)
        isEnabled = false // enable/disable SwipeRefreshLayout
        setClickListener(onItemClickListener) // (optional, set 
        clickListener on recyclerview items)
        setViewAttachListener(viewAttachListener) // (optional, set viewAttachListener on recyclerview items)
        setScrollListener(recyclerViewListener) // (optional, set 
        setScrollListener on recyclerview items)
        setShimmerLayout(R.layout.item_loader) // (optional, set shimmer layout while user waits for the data to load)
     }




private val smartRecyclerViewListener:SmartRecyclerViewListener<T> = object:SmartRecyclerViewListener<T>{

        override fun getItemViewType(model: T): Int {
            return 0 //return viewType from model
        }

        override fun getViewLayout(viewType: Int): Int {
            return R.layout.item_file // on the basis of viewType return the layout you want for the recyclerview item.
        }

        override fun setListSize(size: Int) {
            //this method will be called whenever smartRecyclerView undergoes any operation.
        }

        override fun onRefresh() {
            //do something on refresh....
            smartRecyclerView.isRefreshing = false
            Toast.makeText(baseContext,"OnRefresh Called",Toast.LENGTH_LONG).show()
        }

        override fun onLoadNext() {
        // onLoadNext() will be called if isPaginated = true and user scrolls to bottom or the smartRecyclerView.
            Toast.makeText(baseContext,"OnLoadNext",Toast.LENGTH_LONG).show()
        }
    
    
        //DiffUtils Callback functions
    
        override fun areContentsTheSame(newItem: T, oldItem: T): Boolean {
            return newItem.distance==oldItem.distance
        }

        override fun areItemsTheSame(newItem: T, oldItem: T): Boolean {
            return newItem.uuid==oldItem.uuid
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM