Android-MVVM-Databinding的原理、用法与封装_android viewbinding 只能看到impl类

//常用的三元与判空
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 到布局

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值