Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

建议支持BRV,BaseRecyclerViewAdapterHelper都不维护了 #51

Closed
JasonYinH opened this issue Apr 27, 2022 · 11 comments
Closed

建议支持BRV,BaseRecyclerViewAdapterHelper都不维护了 #51

JasonYinH opened this issue Apr 27, 2022 · 11 comments

Comments

@JasonYinH
Copy link

支持这个感觉不错,https://github.com/liangjingkanji/BRV
很强大,

@DylanCaiCoding
Copy link
Owner

可以考虑一下

@zkzk7749
Copy link

我看好你的水平哦,ViewBindingKTX已经在使用了

@liangjingkanji
Copy link

BRV还存在KTX的优化空间吗?

@DylanCaiCoding
Copy link
Owner

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)

@liangjingkanji
Copy link

  1. ViewBinding可以使用泛型封装吗? 而且onBind的this是BindingViewHolder, 而且里面存在多类型判断处理
  2. 如果想使用缓存可以使用DataBinding或ViewBinding, 并不推荐使用findViewById还做缓存

@DylanCaiCoding
Copy link
Owner

DylanCaiCoding commented May 24, 2022

  1. ViewBinding可以使用泛型封装吗? 而且onBind的this是BindingViewHolder, 而且里面存在多类型判断处理
  2. 如果想使用缓存可以使用DataBinding或ViewBinding, 并不推荐使用findViewById还做缓存

可以,使用泛型封装会用到反射。不用反射也可以,不过要传个高阶函数,代码看起来会稍微有点奇怪。

onBind(ItemSimpleBinding::bind) {
   tvSimple.text = getModel<SimpleModel>().name
}

onBindBindingViewHolder 可以改成用 it 获取,有需要再去取,binding 会比 holder 更常用。这个封装只适用于单类型,多类型怎么去配置我还要考虑一下。

另外文档中的 ViewBinding 用法直接调用 ItemSimpleBinding.bind(itemView) 不太好,这样每次回调 onBindViewHolder() 都执行一堆 findViewById(id) 找出布局内所有加了 id 的控件,并没有做缓存,不知道是不是还有其它用法。

@zkzk7749
Copy link

坐看高手论道

@liangjingkanji
Copy link

  1. onBind本身就只推荐使用轻量级的视图绑定, 另外ViewHolder比ViewBinding使用率更高(因为MVVM主要操作的是数据)
  2. 不推荐反射, 因为列表滑动过于频繁在主线程调用反射
  3. 如果大量视图操作还是建议实现ItemBind接口, 自己做ViewBinding对象持有可能更简单
  4. 我更推荐DataBinding构建MVVM, ViewBinding只是简单去掉fbid, 而且根本不适合封装
  5. 而且依旧没考虑到多类型场景

@DylanCaiCoding
Copy link
Owner

坐看高手论道

只是和东哥交流交流,BRV 功能很多,考虑得很全面,我要先确定我的想法是不是多余的,就得去看下源码。刚好本人来了,就顺便反馈下看源码时的一点疑惑,提点小建议。

@DylanCaiCoding
Copy link
Owner

  1. onBind本身就只推荐使用轻量级的视图绑定, 另外ViewHolder比ViewBinding使用率更高(因为MVVM主要操作的是数据)
  2. 不推荐反射, 因为列表滑动过于频繁在主线程调用反射
  3. 如果大量视图操作还是建议实现ItemBind接口, 自己做ViewBinding对象持有可能更简单
  4. 我更推荐DataBinding构建MVVM, ViewBinding只是简单去掉fbid, 而且根本不适合封装
  5. 而且依旧没考虑到多类型场景

BRV 对 DataBinding 支持已经很好了,所以我更多的是考虑补充一些不方便用 DataBinding 情况。可能有的人觉得 DataBinding 用起来复杂,可能有人像我老大那样反感在 xml 绑定数据(我只能在部门里推一推 ViewBinding)。这时用 BRV 难免要使用 findViewById(id),能用 ViewBinding 就更好。

再看了下源码发现 getModel() 是在 BindingViewHolder 中,哪个作为 this 我再考虑一下。

使用反射和不用反射的用法都会提供,反射的方式会做缓存的,只在创建 holder 时反射一次,BRVAH 也是这么干的。

多类型用法会有点区别,目前有想到两种封装方式,具体的要再斟酌斟酌。

@liangjingkanji
Copy link

liangjingkanji commented Nov 11, 2022

  1. onBind本身就只推荐使用轻量级的视图绑定, 另外ViewHolder比ViewBinding使用率更高(因为MVVM主要操作的是数据)
  2. 不推荐反射, 因为列表滑动过于频繁在主线程调用反射
  3. 如果大量视图操作还是建议实现ItemBind接口, 自己做ViewBinding对象持有可能更简单
  4. 我更推荐DataBinding构建MVVM, ViewBinding只是简单去掉fbid, 而且根本不适合封装
  5. 而且依旧没考虑到多类型场景

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()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants