Android binding.list.addAll()不适用于数据绑定,也使用了binding.executePendingBindings(),但ui未更新

Android binding.list.addAll()不适用于数据绑定,也使用了binding.executePendingBindings(),但ui未更新,android,kotlin,android-databinding,Android,Kotlin,Android Databinding,我不熟悉数据绑定。我的示例很简单,我在recyclerview中添加了一些静态数据,点击按钮一段时间后,我在recyclerview中添加了一些其他数据 所以,对于列表大小为0的情况,第一次可以正常工作,第二次添加数据时,我使用了addAll()和executePendingBindings(),但它不会在ui中反映新数据 if(binding.list?.size==0){ binding.list = it }else{ binding.list?.addAll(it) } bind

我不熟悉数据绑定。我的示例很简单,我在recyclerview中添加了一些静态数据,点击按钮一段时间后,我在recyclerview中添加了一些其他数据

所以,对于列表大小为0的情况,第一次可以正常工作,第二次添加数据时,我使用了
addAll()
executePendingBindings()
,但它不会在ui中反映新数据

if(binding.list?.size==0){ 
binding.list = it 
}else{ 
binding.list?.addAll(it) 
}
binding.executePendingBindings()
所以,如果我使用,这在没有
executePendingBinding()

if(binding.list?.size==0){
binding.list=it
}否则{
var old_newdata:ArrayList=(binding?.list!!+it)作为ArrayList
binding.list=old\u newdata
}
为什么呢?我不明白为什么不使用addAll()和executependingbinding()

MainActivity.kt:

class MainActivity : AppCompatActivity(), ListActionHandler {
    
        private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
        private lateinit var viewModel: MainViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
    
            viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    
            binding.viewModel = viewModel
            binding.list = ArrayList()
            binding.itemclickHandler = this
            startObserving()
        }
    
        private fun startObserving() {
            Handler().postDelayed(Runnable {
    
                var mutableList = ArrayList<Person>()
    
                mutableList.add(Person("Mansi Shah", "User001", 0, ""))
                mutableList.add(Person("Muuni Shah", "User002", 1, ""))
                mutableList.add(Person("Alpa Shah", "User003", 0, ""))
                mutableList.add(Person("Solani Shah", "User004", 1, ""))
                mutableList.add(Person("Menka Shah", "User005", 0, ""))
                mutableList.add(Person("Misri Shah", "User006", 0, ""))
                mutableList.add(Person("Moti Shah", "User007", 1, ""))
                mutableList.add(Person("Khevana Shah", "User008", 1, ""))
    
                //binding.list?.addAll(mutableList)
                viewModel.setListData(mutableList)
    
            }, 10000)
    
            viewModel.mutablelistData?.observe(this, Observer {
    
                it?.let {
                    //binding.list = it
                    if (binding.list?.size == 0) {
                        binding.list = it
                    } else {
                        // todo: working without execute binding and without addAll, but with =
                        // var old_newdata:ArrayList<Person> = (binding?.list!!+it) as ArrayList<Person>
                        //  binding.list = old_newdata
    
                        //todo : Not working with execute binding , so need to notify adapter
                        //binding.list?.addAll(it)
                        //binding.executePendingBindings()
    
                        val startposition = binding.list!!.size
                        binding.list?.addAll(it)
                        binding.rvPerson.adapter?.notifyItemRangeChanged(startposition, it.size)
    
                    }
    
                }
            })
        }
    
        override fun btnClick(position: Int) {
            val item = binding.list?.get(position)
    
            item?.let {
    
                when (item.follow_status) {
                    0 -> {
                        val item1 = binding.list?.get(position)?.copy(follow_status = 1)
                        viewModel.mutablelistData.value?.set(position, item1!!)
                        binding.rvPerson.adapter?.notifyItemChanged(position, item1!!)
                        //binding.rvPerson.adapter?.notifyDataSetChanged()
                    }
                    1 -> {
                        val item1 = binding.list?.get(position)?.copy(follow_status = 0)
                        viewModel.mutablelistData.value?.set(position, item1!!)
                        binding.rvPerson.adapter?.notifyItemChanged(position, item1!!)
                        // viewModel.mutablelistData.value?.set(position, item1!!)
                    }
                    else -> {
                        val item1 = binding.list?.get(position)?.copy(follow_status = 0)
                        viewModel.mutablelistData.value?.set(position, item1!!)
                        binding.rvPerson.adapter?.notifyItemChanged(position, item1!!)
                        // viewModel.mutablelistData.value?.set(position, item1!!)
                    }
                }
            }
        }
    
        override fun btnAddClick() {
            var mutableList = ArrayList<Person>()
    
            mutableList.add(Person("Denma Shah", "User009", 0, ""))
            mutableList.add(Person("Irish Shah", "User0010", 1, ""))
            mutableList.add(Person("Mangolia Shah", "User0011", 0, ""))
            mutableList.add(Person("Lily Shah", "User0012", 1, ""))
            mutableList.add(Person("Bloom Shah", "User0013", 0, ""))
            mutableList.add(Person("Iva Shah", "User0014", 0, ""))
            mutableList.add(Person("Ishika Shah", "User0015", 1, ""))
            mutableList.add(Person("Oliver Shah", "User0016", 1, ""))
    
            //old data
            // mutableList.addAll(viewModel.getListData())
            viewModel.setListData(mutableList)
        }
    }
class ListDataAdpater(
    private val listData: ArrayList<Person>,
    private val clickHandler: ListActionHandler
) : RecyclerView.Adapter<ListDataAdpater.ViewHolder>() {

    private var binding: ListItemDataBinding? = null

    inner class ViewHolder(val binding: ListItemDataBinding) :
        RecyclerView.ViewHolder(binding.root) {

        init {
            setIsRecyclable(true)
        }

        fun bind(data: Person) {
            binding?.listItemData = data
            binding?.clickHandler = clickHandler
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        binding = ListItemDataBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding!!)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(listData[position])
        holder.binding.position = position
    }

    override fun getItemCount(): Int {
        return listData.size
    }
}
<?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:bind="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View" />

        <variable
            name="listItemData"
            type="com.example.databindingdemo.model.Person" />

        <variable
            name="clickHandler"
            type="com.example.databindingdemo.actionhandler.ListActionHandler" />

        <variable
            name="position"
            type="int" />

    </data>

    <!--  <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="@dimen/_10sdp"
          android:orientation="vertical"
          android:visibility="gone"/>-->

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black"
        android:padding="@dimen/_2sdp">


        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/imgUserSeach"
            android:layout_width="@dimen/_58sdp"
            android:layout_height="@dimen/_58sdp"
            android:adjustViewBounds="true"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            bind:roundedCornersRad="@{`3`}"
            bind:url="@{listItemData==null?``:listItemData.url}" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingStart="@dimen/_5sdp"
            android:paddingEnd="@dimen/_5sdp"
            android:weightSum="3"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/imgUserSeach"
            app:layout_constraintTop_toTopOf="parent">

            <RelativeLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_weight="2">

                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tvUserName"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:fontFamily="@font/montserrat_medium"
                    android:letterSpacing="0.02"
                    android:lineSpacingExtra="8sp"
                    android:lines="1"
                    android:text="@{listItemData.full_name}"
                    android:textColor="@android:color/white"
                    android:textSize="13.3sp"
                    tools:text="Mansi Shah" />

                <!-- android:onClick="@{(v)->searchItemHandler.onItemClick(searchData)}"-->

                <androidx.appcompat.widget.AppCompatTextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/tvUserName"
                    android:layout_marginTop="@dimen/_8sdp"
                    android:ellipsize="end"
                    android:fontFamily="@font/montserrat_medium"
                    android:letterSpacing="0.02"
                    android:lineSpacingExtra="11.3sp"
                    android:lines="1"
                    android:text="@{listItemData.username}"
                    android:textColor="#80ffffff"
                    android:textSize="10sp"
                    tools:text="User001" />

                <androidx.appcompat.widget.AppCompatCheckBox
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/tvUserName"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentRight="true" />

            </RelativeLayout>

            <RelativeLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_weight="1">

                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/btnFollow"
                    style="@style/buttonTheme"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentRight="true"
                    android:layout_centerVertical="true"
                    android:background="@{listItemData.follow_status == 0?@drawable/cyan_button: @drawable/grey_button}"
                    android:ellipsize="end"
                    android:lineSpacingExtra="4.5sp"
                    android:lines="1"
                    android:onClick="@{(v)->clickHandler.btnClick(position)}"
                    android:text="@{listItemData.follow_status == 0? @string/follow : @string/following}" />
            </RelativeLayout>

        </LinearLayout>

        <View
            android:id="@+id/vdivider"
            android:layout_width="match_parent"
            android:layout_height="@dimen/_1sdp"
            android:layout_marginTop="@dimen/_10sdp"
            android:background="#8b9096"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imgUserSeach" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>
@JvmStatic // add this line !!
        @BindingAdapter(value = ["bind:list", "bind:clickHandler"], requireAll = false)
        fun bindAdapter(view: RecyclerView, list: ArrayList<Person>?, handler: ListActionHandler) {

            list?.let {
                val adapter = ListDataAdpater(list, handler)
                view.adapter = adapter
            }
        }
class MainActivity:AppCompatActivity(),ListActionHandler{
惰性{ActivityMainBinding.inflate(layoutInflater)}的私有val绑定
私有lateinit变量viewModel:MainViewModel
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(binding.root)
viewModel=ViewModelProviders.of(this.get)(MainViewModel::class.java)
binding.viewModel=viewModel
binding.list=ArrayList()
binding.itemclickHandler=此
startObserving()
}
私人娱乐服务(){
Handler().postDelayed(可运行{
var mutableList=ArrayList()
添加(Person(“Mansi Shah”,“User001”,0,”)
可变列表。添加(人(“Muuni Shah”,“User002”,1“))
可变列表。添加(Person(“Alpa Shah”,“User003”,0,”)
可变列表。添加(个人(“索拉尼·沙阿”,“用户004”,1,”)
添加(Person(“Menka Shah”,“User005”,0,”)
添加(Person(“Misri Shah”,“User006”,0,”)
添加(Person(“Moti Shah”,“User007”,1,”)
添加(Person(“Khevana Shah”,“User008”,1,”))
//binding.list?.addAll(可变列表)
viewModel.setListData(可变列表)
}, 10000)
viewModel.mutablelistData?观察(此,观察者{
是吗?让我来{
//binding.list=it
if(binding.list?.size==0){
binding.list=it
}否则{
//todo:在没有执行绑定和addAll的情况下工作,但使用=
//var old_newdata:ArrayList=(binding?.list!!+it)作为ArrayList
//binding.list=old\u newdata
//todo:无法使用执行绑定,因此需要通知适配器
//绑定.list?.addAll(it)
//binding.executePendingBindings()
val startposition=binding.list!!.size
绑定.list?.addAll(it)
binding.rvPerson.adapter?.notifyItemRange已更改(起始位置,it.size)
}
}
})
}
覆盖趣味btnClick(位置:Int){
val item=binding.list?.get(位置)
项目?让我们{
时间(项目跟踪状态){
0 -> {
val item1=绑定。列表?获取(位置)?复制(跟随状态=1)
viewModel.mutablelistData.value?.set(位置,item1!!)
binding.rvPerson.adapter?.notifyItemChanged(位置,item1!!)
//binding.rvPerson.adapter?.notifyDataSetChanged()
}
1 -> {
val item1=绑定。列表?获取(位置)?。复制(跟随状态=0)
viewModel.mutablelistData.value?.set(位置,item1!!)
binding.rvPerson.adapter?.notifyItemChanged(位置,item1!!)
//viewModel.mutablelistData.value?.set(位置,item1!!)
}
其他->{
val item1=绑定。列表?获取(位置)?。复制(跟随状态=0)
viewModel.mutablelistData.value?.set(位置,item1!!)
binding.rvPerson.adapter?.notifyItemChanged(位置,item1!!)
//viewModel.mutablelistData.value?.set(位置,item1!!)
}
}
}
}
覆盖有趣的btnAddClick(){
var mutableList=ArrayList()
添加(Person(“Denma Shah”,“User009”,0,”)
添加(Person(“爱尔兰国王”,“用户0010”,1,”)
添加(Person(“Mangolia Shah”,“User0011”,0,”)
添加(Person(“Lily Shah”,“User0012”,1,”)
添加(Person(“bloomshah”,“User0013”,0,”)
添加(Person(“Iva Shah”,“User0014”,0,”)
添加(Person(“Ishika Shah”,“User0015”,1“”))
添加(Person(“Oliver Shah”,“User0016”,1,”)
//旧数据
//mutableList.addAll(viewModel.getListData())
viewModel.setListData(可变列表)
}
}
活动\u main.xml

<?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"
    xmlns:bind="http://schemas.android.com/apk/res-auto">

    <data>

        <import type="android.view.View" />

        <import type="java.util.ArrayList"/>

        <variable
            name="viewModel"
            type="com.example.databindingdemo.viewmodel.MainViewModel" />

        <variable
            name="list"
            type="ArrayList&lt;com.example.databindingdemo.model.Person&gt;" />

        <variable
            name="itemclickHandler"
            type="com.example.databindingdemo.actionhandler.ListActionHandler" />

    </data>


    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btnAdd"
            style="@style/buttonTheme"
            android:background="@color/colorPrimaryDark"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:onClick="@{(v)->itemclickHandler.btnAddClick()}"
            android:text="ADD"/>


        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btnNext"
            style="@style/buttonTheme"
            android:background="@color/colorPrimaryDark"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:text="Next"/>
        
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rvPerson"
            app:layout_constraintTop_toBottomOf="@+id/btnAdd"
            app:layout_constraintBottom_toBottomOf="parent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:orientation="vertical"
            bind:list="@{list}"
            bind:clickHandler="@{itemclickHandler}"
            android:visibility="@{list!=null &amp;&amp; list.size()>0? View.VISIBLE:View.GONE}"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

        <TextView
            android:id="@+id/no_data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="No Data in List !!!"
            android:visibility="@{list!=null &amp;&amp; list.size()>0? View.GONE:View.VISIBLE}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

listdatadapater.kt:

class MainActivity : AppCompatActivity(), ListActionHandler {
    
        private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
        private lateinit var viewModel: MainViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
    
            viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    
            binding.viewModel = viewModel
            binding.list = ArrayList()
            binding.itemclickHandler = this
            startObserving()
        }
    
        private fun startObserving() {
            Handler().postDelayed(Runnable {
    
                var mutableList = ArrayList<Person>()
    
                mutableList.add(Person("Mansi Shah", "User001", 0, ""))
                mutableList.add(Person("Muuni Shah", "User002", 1, ""))
                mutableList.add(Person("Alpa Shah", "User003", 0, ""))
                mutableList.add(Person("Solani Shah", "User004", 1, ""))
                mutableList.add(Person("Menka Shah", "User005", 0, ""))
                mutableList.add(Person("Misri Shah", "User006", 0, ""))
                mutableList.add(Person("Moti Shah", "User007", 1, ""))
                mutableList.add(Person("Khevana Shah", "User008", 1, ""))
    
                //binding.list?.addAll(mutableList)
                viewModel.setListData(mutableList)
    
            }, 10000)
    
            viewModel.mutablelistData?.observe(this, Observer {
    
                it?.let {
                    //binding.list = it
                    if (binding.list?.size == 0) {
                        binding.list = it
                    } else {
                        // todo: working without execute binding and without addAll, but with =
                        // var old_newdata:ArrayList<Person> = (binding?.list!!+it) as ArrayList<Person>
                        //  binding.list = old_newdata
    
                        //todo : Not working with execute binding , so need to notify adapter
                        //binding.list?.addAll(it)
                        //binding.executePendingBindings()
    
                        val startposition = binding.list!!.size
                        binding.list?.addAll(it)
                        binding.rvPerson.adapter?.notifyItemRangeChanged(startposition, it.size)
    
                    }
    
                }
            })
        }
    
        override fun btnClick(position: Int) {
            val item = binding.list?.get(position)
    
            item?.let {
    
                when (item.follow_status) {
                    0 -> {
                        val item1 = binding.list?.get(position)?.copy(follow_status = 1)
                        viewModel.mutablelistData.value?.set(position, item1!!)
                        binding.rvPerson.adapter?.notifyItemChanged(position, item1!!)
                        //binding.rvPerson.adapter?.notifyDataSetChanged()
                    }
                    1 -> {
                        val item1 = binding.list?.get(position)?.copy(follow_status = 0)
                        viewModel.mutablelistData.value?.set(position, item1!!)
                        binding.rvPerson.adapter?.notifyItemChanged(position, item1!!)
                        // viewModel.mutablelistData.value?.set(position, item1!!)
                    }
                    else -> {
                        val item1 = binding.list?.get(position)?.copy(follow_status = 0)
                        viewModel.mutablelistData.value?.set(position, item1!!)
                        binding.rvPerson.adapter?.notifyItemChanged(position, item1!!)
                        // viewModel.mutablelistData.value?.set(position, item1!!)
                    }
                }
            }
        }
    
        override fun btnAddClick() {
            var mutableList = ArrayList<Person>()
    
            mutableList.add(Person("Denma Shah", "User009", 0, ""))
            mutableList.add(Person("Irish Shah", "User0010", 1, ""))
            mutableList.add(Person("Mangolia Shah", "User0011", 0, ""))
            mutableList.add(Person("Lily Shah", "User0012", 1, ""))
            mutableList.add(Person("Bloom Shah", "User0013", 0, ""))
            mutableList.add(Person("Iva Shah", "User0014", 0, ""))
            mutableList.add(Person("Ishika Shah", "User0015", 1, ""))
            mutableList.add(Person("Oliver Shah", "User0016", 1, ""))
    
            //old data
            // mutableList.addAll(viewModel.getListData())
            viewModel.setListData(mutableList)
        }
    }
class ListDataAdpater(
    private val listData: ArrayList<Person>,
    private val clickHandler: ListActionHandler
) : RecyclerView.Adapter<ListDataAdpater.ViewHolder>() {

    private var binding: ListItemDataBinding? = null

    inner class ViewHolder(val binding: ListItemDataBinding) :
        RecyclerView.ViewHolder(binding.root) {

        init {
            setIsRecyclable(true)
        }

        fun bind(data: Person) {
            binding?.listItemData = data
            binding?.clickHandler = clickHandler
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        binding = ListItemDataBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding!!)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(listData[position])
        holder.binding.position = position
    }

    override fun getItemCount(): Int {
        return listData.size
    }
}
<?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:bind="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View" />

        <variable
            name="listItemData"
            type="com.example.databindingdemo.model.Person" />

        <variable
            name="clickHandler"
            type="com.example.databindingdemo.actionhandler.ListActionHandler" />

        <variable
            name="position"
            type="int" />

    </data>

    <!--  <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="@dimen/_10sdp"
          android:orientation="vertical"
          android:visibility="gone"/>-->

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black"
        android:padding="@dimen/_2sdp">


        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/imgUserSeach"
            android:layout_width="@dimen/_58sdp"
            android:layout_height="@dimen/_58sdp"
            android:adjustViewBounds="true"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            bind:roundedCornersRad="@{`3`}"
            bind:url="@{listItemData==null?``:listItemData.url}" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingStart="@dimen/_5sdp"
            android:paddingEnd="@dimen/_5sdp"
            android:weightSum="3"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/imgUserSeach"
            app:layout_constraintTop_toTopOf="parent">

            <RelativeLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_weight="2">

                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/tvUserName"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:fontFamily="@font/montserrat_medium"
                    android:letterSpacing="0.02"
                    android:lineSpacingExtra="8sp"
                    android:lines="1"
                    android:text="@{listItemData.full_name}"
                    android:textColor="@android:color/white"
                    android:textSize="13.3sp"
                    tools:text="Mansi Shah" />

                <!-- android:onClick="@{(v)->searchItemHandler.onItemClick(searchData)}"-->

                <androidx.appcompat.widget.AppCompatTextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/tvUserName"
                    android:layout_marginTop="@dimen/_8sdp"
                    android:ellipsize="end"
                    android:fontFamily="@font/montserrat_medium"
                    android:letterSpacing="0.02"
                    android:lineSpacingExtra="11.3sp"
                    android:lines="1"
                    android:text="@{listItemData.username}"
                    android:textColor="#80ffffff"
                    android:textSize="10sp"
                    tools:text="User001" />

                <androidx.appcompat.widget.AppCompatCheckBox
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/tvUserName"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentRight="true" />

            </RelativeLayout>

            <RelativeLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_weight="1">

                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/btnFollow"
                    style="@style/buttonTheme"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentRight="true"
                    android:layout_centerVertical="true"
                    android:background="@{listItemData.follow_status == 0?@drawable/cyan_button: @drawable/grey_button}"
                    android:ellipsize="end"
                    android:lineSpacingExtra="4.5sp"
                    android:lines="1"
                    android:onClick="@{(v)->clickHandler.btnClick(position)}"
                    android:text="@{listItemData.follow_status == 0? @string/follow : @string/following}" />
            </RelativeLayout>

        </LinearLayout>

        <View
            android:id="@+id/vdivider"
            android:layout_width="match_parent"
            android:layout_height="@dimen/_1sdp"
            android:layout_marginTop="@dimen/_10sdp"
            android:background="#8b9096"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/imgUserSeach" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>
@JvmStatic // add this line !!
        @BindingAdapter(value = ["bind:list", "bind:clickHandler"], requireAll = false)
        fun bindAdapter(view: RecyclerView, list: ArrayList<Person>?, handler: ListActionHandler) {

            list?.let {
                val adapter = ListDataAdpater(list, handler)
                view.adapter = adapter
            }
        }
类列表数据适配器(
private val listData:ArrayList,
私有val clickHandler:ListActionHandler
):RecyclerView.Adapter(){
私有变量绑定:ListItemDataBinding?=null
内部类ViewHolder(val绑定:ListItemD