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

ViewBinding支持复用 #286

Closed
von-mon opened this issue Nov 9, 2022 · 9 comments
Closed

ViewBinding支持复用 #286

von-mon opened this issue Nov 9, 2022 · 9 comments
Labels
提议 New feature or request

Comments

@von-mon
Copy link

von-mon commented Nov 9, 2022

问题描述

addType(R.layout.item_simple) 不支持viewBinding

期望行为

期望支持view Binding ,不习惯使用databinding

如何复现

任何业务相关问题没有fork仓库复现问题一律无法解决, 凭空猜测只会让问题晦涩难懂, 大量耽误项目维护时间

截图

异常堆栈信息或者手机截图/视频(拖拽到输入框即可上传)

版本

  • BRV:
  • Android:
  • Gradle:
  • Android Studio:
@von-mon von-mon added the 寻求帮助 Extra attention is needed label Nov 9, 2022
@liangjingkanji
Copy link
Owner

文档和demo不是都有使用示例吗?

ViewBinding

@liangjingkanji
Copy link
Owner

ViewBinding只是取代findViewById的一个小工具而已, 和DataBinding不是同类型框架(DataBinding包含ViewBinding的功能)

DataBinding是双向数据绑定工具

我不明白你说addType()不支持ViewBinding是什么情况? 两者没有什么关系吧?

@jin123d
Copy link

jin123d commented Nov 11, 2022

ViewBinding只是取代findViewById的一个小工具而已, 和DataBinding不是同类型框架(DataBinding包含ViewBinding的功能)

DataBinding是双向数据绑定工具

我不明白你说addType()不支持ViewBinding是什么情况? 两者没有什么关系吧?

根据官方的recyclerView使用说明 ,ViewHolder在创建时,就直接调用findViewById来方法来获取子view,在onBindViewHolder时即可直接操作子view。
按照目前BRV 文档中的用法,如果dataBindingEnable时,会生成viewDataBinding,并且传递到BindingViewHolder中,这种使用是正确的。
但是如果不使用dataBinding,按照文档所写,则是在onBind()方法中进行findview(使用ViewBinding亦是如此,在onBind()方法中调用ItemSimpleBinding.bind(itemView))。
按照我的理解,是否应该在onCreate() 进行ItemSimpleBinding.bind(itemView),【文档中虽然写了onCreate() 调用ItemSimpleBinding.bind(),但是生成的binding类并未传递到ViewHolder】,在onBind()时拿到生成的生成的binding类来进行UI操作。

简言之,

  • onBind()方法中进行findview是否合理(不使用ViewBinding时。
  • ViewHolder类是否需要持有生成的binding类(使用ViewBinding时)。

@liangjingkanji
Copy link
Owner

  1. 合理, BRVAH亦或原始的RecyclerView.ViewHolder都是在OnBindViewHolder里面findViewById()
  2. 如下

关于你说的ViewHolder直接持有binding类(就像databinding使用getBinding()一样)我认为可以考虑

但是为什么我一直没有实现这是因为我认为并没有简化多少代码量并且ViewBinding本身不适合封装

val binding = getBinding<ItemViewBinding>()
val binding = ItemViewBinding.bind(itemView)

但是@DylanCaiCoding提过在onBind中反复调用bind()稍微影响性能(DylanCaiCoding/ViewBindingKTX#51 (comment)), 应当进行缓存. 当初我的看法是性能影响微乎其微并且可以自己在model中缓存

但是现在我认为让ViewBinding和DataBinding用法趋同可能更好, 并且减少学习成本, 关于这点提议我觉得可以改进下, 也欢迎你Pr

@liangjingkanji liangjingkanji changed the title 期望后续会支持Viewgbinding ViewBinding支持复用 Nov 11, 2022
@liangjingkanji liangjingkanji added 提议 New feature or request and removed 寻求帮助 Extra attention is needed labels Nov 11, 2022
@liangjingkanji
Copy link
Owner

liangjingkanji commented Nov 11, 2022

使用getBinding()获取ViewBinding实例, 这是不是你想要的效果

binding.rv.linear().setup {
    addType<SimpleModel>(R.layout.item_simple)
    onBind {
        val binding = getBinding<ItemSimpleBinding>() // getBinding()现在同时支持`DataBinding/ViewBinding`
        binding.tvSimple.text = layoutPosition.toString()
    }
}.models = getData()

升级最新版本

@jin123d
Copy link

jin123d commented Nov 14, 2022

  1. 合理, BRVAH亦或原始的RecyclerView.ViewHolder都是在OnBindViewHolder里面findViewById()
  2. 如下

关于你说的ViewHolder直接持有binding类(就像databinding使用getBinding()一样)我认为可以考虑

但是为什么我一直没有实现这是因为我认为并没有简化多少代码量并且ViewBinding本身不适合封装

val binding = getBinding<ItemViewBinding>()
val binding = ItemViewBinding.bind(itemView)

但是@DylanCaiCoding提过在onBind中反复调用bind()稍微影响性能(DylanCaiCoding/ViewBindingKTX#51 (comment)), 应当进行缓存. 当初我的看法是性能影响微乎其微并且可以自己在model中缓存

但是现在我认为让ViewBinding和DataBinding用法趋同可能更好, 并且减少学习成本, 关于这点提议我觉得可以改进下, 也欢迎你Pr

关于第一点,我看官方的文档是在onCreateViewHolder,并不是在onBindViewHolder中进行findViewById,文档在这里
https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=zh-cn#implement-adapter。

image

@liangjingkanji
Copy link
Owner

liangjingkanji commented Nov 14, 2022

关于 @jin123d 说的第一点, 那无法封装实现的(因为ViewBinding需要指定具体类), 而且也没有必要, 我认为你没有理解官方写的目的

官方示例是为了避免频繁触发onBindViewHolder来findViewById以减少轻微性能损耗, 但是getBinding()本身也会进行缓存, 所以两者性能一致

即使每次在onBindViewHolder里面findViewById对性能影响也比较轻微, 例如比较有名气的BRVAH完全没有缓存每次都会去findViewById

如果你有更好的解决办法欢迎提出

@jin123d
Copy link

jin123d commented Nov 14, 2022

关于 @jin123d 说的第一点, 那无法封装实现的(因为ViewBinding需要指定具体类), 而且也没有必要, 我认为你没有理解官方写的目的

官方示例是为了避免频繁触发onBindViewHolder来findViewById以减少轻微性能损耗, 但是getBinding()本身也会进行缓存, 所以两者性能一致

即使每次在onBindViewHolder里面findViewById对性能影响也比较轻微, 例如比较有名气的BRVAH完全没有缓存每次都会去findViewById

如果你有更好的解决办法欢迎提出

我同意你的第二点的解决方法,只是对原始的RecyclerView.ViewHolder都是在OnBindViewHolder里面findViewById()这句话有点疑问,目前来看getBinding()已经能够达到缓存的目的了。

@liangjingkanji
Copy link
Owner

@jin123d 欢迎共同探讨实现方案

@liangjingkanji liangjingkanji unpinned this issue Apr 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
提议 New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants