//常用的三元与判空
android:text=“@{user.name != null ? user.name : user.nickName}”
android:text=“@{user.name ?? user.nickName}”
android:visibility=“@{user.active ? View.VISIBLE : View.GONE}”
事件的简单处理:
android:onClick=“@{click::onClickFriend}”
android:onClick=“@{() -> click.onSaveClick(task)}”
android:onClick=“@{(theView) -> click.onSaveClick(theView, task)}”
android:onLongClick=“@{(theView) -> click.onLongClick(theView, task)}”
//控件隐藏不设置点击,显示才设置点击
android:onClick=“@{(v) -> v.isVisible() ? doSomething() : void}”
双向绑定:@= 与 @ 的区别
使用单向绑定的时候@{},viewModel中的数据变化了,就会影响到TextView的显示。而双向绑定则是当EditText内部的文本发生变化了也同样会影响到viewModel中的数据变化。
三、DataBinding的进阶使用
关于 DataBinding 的基础使用,相信大家或多或少都有看过或者用过,知道基础使用就能在开发中实际开发了吗?太年轻了!
详细用过 DataBinding 的或多或少都遇到过一些坑,作为一个常年使用 DataBinding 的开发者,我对下面几点实际开发中遇到的一些印象深刻的知识点做一些实用的引申。
3.1 RV.Adapter中使用
与 Fragment 的使用方式类似,我们只需要绑定了 View 之后设置给ViewHodler即可。
class UserAdapter(users: MutableList, context: Context) :
RecyclerView.Adapter<UserAdapter.MyHolder>() {
class MyHolder(val binding: TextItemBinding) : RecyclerView.ViewHolder(binding.root)
private var users: MutableList = arrayListOf()
private var context: Context
init {
this.users = users
this.context = context
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {
val inflater = LayoutInflater.from(context)
val binding: TextItemBinding = DataBindingUtil.inflate(inflater, R.layout.text_item, parent, false)
return MyHolder(binding)
}
override fun onBindViewHolder(holder: MyHolder, position: Int) {
holder.binding.user = users[position]
holder.binding.executePendingBindings()
}
override fun getItemCount() = users.size
}
3.2 自定义View的使用
比如我定义一个自定义View,在内部使用了自定义的属性,需要在 xml 中赋值,
<com.guadou.kt_demo.demo.demo12_databinding_texing.CustomTestView
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
binding:clickProxy=“@{click}”
binding:testBean=“@{testBean}” />
我们再自定义View的类中就可以通过 setXX 拿到这个赋值的属性了。
class CustomTestView @JvmOverloads constructor(context: Context?, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
LinearLayout(context, attrs, defStyleAttr) {
init {
orientation = VERTICAL
//传统的方式添加
val view = CommUtils.inflate(R.layout.layout_custom_databinding_test)
addView(view)
}
//设置属性
fun setTestBean(bean: TestBindingBean?) {
bean?.let {
findViewById(R.id.tv_custom_test1).text = it.text1
findViewById(R.id.tv_custom_test2).text = it.text2
findViewById(R.id.tv_custom_test3).text = it.text3
}
}
fun setClickProxy(click: Demo12Activity.ClickProxy?) {
findViewById(R.id.tv_custom_test1).click {
click?.testToast()
}
}
}
如果我们的自定义View不是写在 XML 中,而是通过Java代码手动 add 到布局