ViewBindingKTX
ViewBindingKTX copied to clipboard
建议支持BRV,BaseRecyclerViewAdapterHelper都不维护了
支持这个感觉不错,https://github.com/liangjingkanji/BRV 很强大,
可以考虑一下
我看好你的水平哦,ViewBindingKTX已经在使用了
BRV还存在KTX的优化空间吗?
BRV还存在KTX的优化空间吗?
我去,东哥怎么大驾光临了... 其实 BRV 结合 ViewBinding 使用会更方便一点,目前想到的封装是:
rv.linear().setup {
addType<SimpleModel>(R.layout.item_simple)
onBind<ItemSimpleBinding> { // 使用 ViewBinding
tvSimple.text = getModel<SimpleModel>().name
}
}.models = getData()
对了东哥,我看源码发现 BindingViewHolder.findView(id) 是直接调用了 findViewById(id),这里做个缓存会更好,不然每次回调 onBindViewHolder() 都 findViewById(id)。
- ViewBinding可以使用泛型封装吗? 而且
onBind的this是BindingViewHolder, 而且里面存在多类型判断处理 - 如果想使用缓存可以使用DataBinding或ViewBinding, 并不推荐使用
findViewById还做缓存
- ViewBinding可以使用泛型封装吗? 而且
onBind的this是BindingViewHolder, 而且里面存在多类型判断处理- 如果想使用缓存可以使用DataBinding或ViewBinding, 并不推荐使用
findViewById还做缓存
可以,使用泛型封装会用到反射。不用反射也可以,不过要传个高阶函数,代码看起来会稍微有点奇怪。
onBind(ItemSimpleBinding::bind) {
tvSimple.text = getModel<SimpleModel>().name
}
onBind 的 BindingViewHolder 可以改成用 it 获取,有需要再去取,binding 会比 holder 更常用。这个封装只适用于单类型,多类型怎么去配置我还要考虑一下。
另外文档中的 ViewBinding 用法直接调用 ItemSimpleBinding.bind(itemView) 不太好,这样每次回调 onBindViewHolder() 都执行一堆 findViewById(id) 找出布局内所有加了 id 的控件,并没有做缓存,不知道是不是还有其它用法。
坐看高手论道
onBind本身就只推荐使用轻量级的视图绑定, 另外ViewHolder比ViewBinding使用率更高(因为MVVM主要操作的是数据)- 不推荐反射, 因为列表滑动过于频繁在主线程调用反射
- 如果大量视图操作还是建议实现
ItemBind接口, 自己做ViewBinding对象持有可能更简单 - 我更推荐DataBinding构建MVVM,
ViewBinding只是简单去掉fbid, 而且根本不适合封装 - 而且依旧没考虑到多类型场景
坐看高手论道
只是和东哥交流交流,BRV 功能很多,考虑得很全面,我要先确定我的想法是不是多余的,就得去看下源码。刚好本人来了,就顺便反馈下看源码时的一点疑惑,提点小建议。
onBind本身就只推荐使用轻量级的视图绑定, 另外ViewHolder比ViewBinding使用率更高(因为MVVM主要操作的是数据)- 不推荐反射, 因为列表滑动过于频繁在主线程调用反射
- 如果大量视图操作还是建议实现
ItemBind接口, 自己做ViewBinding对象持有可能更简单- 我更推荐DataBinding构建MVVM,
ViewBinding只是简单去掉fbid, 而且根本不适合封装- 而且依旧没考虑到多类型场景
BRV 对 DataBinding 支持已经很好了,所以我更多的是考虑补充一些不方便用 DataBinding 情况。可能有的人觉得 DataBinding 用起来复杂,可能有人像我老大那样反感在 xml 绑定数据(我只能在部门里推一推 ViewBinding)。这时用 BRV 难免要使用 findViewById(id),能用 ViewBinding 就更好。
再看了下源码发现 getModel() 是在 BindingViewHolder 中,哪个作为 this 我再考虑一下。
使用反射和不用反射的用法都会提供,反射的方式会做缓存的,只在创建 holder 时反射一次,BRVAH 也是这么干的。
多类型用法会有点区别,目前有想到两种封装方式,具体的要再斟酌斟酌。
onBind本身就只推荐使用轻量级的视图绑定, 另外ViewHolder比ViewBinding使用率更高(因为MVVM主要操作的是数据)- 不推荐反射, 因为列表滑动过于频繁在主线程调用反射
- 如果大量视图操作还是建议实现
ItemBind接口, 自己做ViewBinding对象持有可能更简单- 我更推荐DataBinding构建MVVM,
ViewBinding只是简单去掉fbid, 而且根本不适合封装- 而且依旧没考虑到多类型场景
BRV 对 DataBinding 支持已经很好了,所以我更多的是考虑补充一些不方便用 DataBinding 情况。可能有的人觉得 DataBinding 用起来复杂,可能有人像我老大那样反感在 xml 绑定数据(我只能在部门里推一推 ViewBinding)。这时用 BRV 难免要使用
findViewById(id),能用 ViewBinding 就更好。再看了下源码发现
getModel()是在BindingViewHolder中,哪个作为 this 我再考虑一下。使用反射和不用反射的用法都会提供,反射的方式会做缓存的,只在创建 holder 时反射一次,BRVAH 也是这么干的。
多类型用法会有点区别,目前有想到两种封装方式,具体的要再斟酌斟酌。
经过改进, getBinding()同时支持DataBinding/ViewBinding, 按照你提到的反射+缓存实现
binding.rv.linear().setup {
addType<SimpleModel>(R.layout.item_simple)
onBind {
val binding = getBinding<ItemSimpleBinding>() // 使用ViewBinding
binding.tvSimple.text = layoutPosition.toString()
}
}.models = getData()