liangjingkanji / BRV

[使用文档] Android 快速构建 RecyclerView, 比 BRVAH 更简单强大
http://liangjingkanji.github.io/BRV/
MIT License
2.59k stars 327 forks source link

Caused by: java.lang.NoSuchMethodException: androidx.viewbinding.ViewBinding.bind [class android.view.View] #345

Closed ivotai closed 1 year ago

ivotai commented 1 year ago

问题描述

在多类型中使用 val binding = getBinding<ViewBinding>() 区分,报错如下 Caused by: java.lang.NoSuchMethodException: androidx.viewbinding.ViewBinding.bind [class android.view.View] ViewBinding 源码

public interface ViewBinding {
    /**
     * Returns the outermost {@link View} in the associated layout file. If this binding is for a
     * {@code <merge>} layout, this will return the first view inside of the merge tag.
     */
    @NonNull
    View getRoot();
}

没有 bind 方法啊。

liangjingkanji commented 1 year ago

你有在gradle中开启viewBinding或者databinding框架吗?

两者都没启用则getBinding()方法不允许调用

asdzheng commented 1 year ago

我viewBinding是开了的,不知道为什么还是会出现这个异常

liangjingkanji commented 1 year ago

可能没打开kapt插件, 建议下载demo多试试排查下

w296365959 commented 1 year ago

需要在 生命周期方法里如onBind 这些根据itemViewType判断后才可使用

liangjingkanji commented 1 year ago

长时间没有回复本问题关闭

wlqjj0 commented 1 year ago

@liangjingkanji 单一类型没有问题 多类型会崩溃

liangjingkanji commented 1 year ago

@wlqjj0 崩溃请fork仓库复现问题或者提交崩溃日志

我认为几乎可以肯定是你代码写错了

wlqjj0 commented 1 year ago
image image

@liangjingkanji 最新仓库代码 都注释了标签 其他未动 2023-05-10 08:37:23.542 6342-6342/com.drake.brv.sample E/AndroidRuntime: FATAL EXCEPTION: main Process: com.drake.brv.sample, PID: 6342 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:523) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)  Caused by: java.lang.NoSuchMethodException: androidx.viewbinding.ViewBinding.bind [class android.view.View] at java.lang.Class.getMethod(Class.java:2072) at java.lang.Class.getMethod(Class.java:1693) at com.drake.brv.sample.ui.fragment.ViewBindingFragment$onViewCreated$1$1.invoke(ViewBindingFragment.kt:60) at com.drake.brv.sample.ui.fragment.ViewBindingFragment$onViewCreated$1$1.invoke(ViewBindingFragment.kt:28) at com.drake.brv.BindingAdapter$BindingViewHolder.bind$brv_debug(BindingAdapter.kt:1103) at com.drake.brv.BindingAdapter.onBindViewHolder(BindingAdapter.kt:167) at com.drake.brv.BindingAdapter.onBindViewHolder(BindingAdapter.kt:70) at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7254) at com.drake.brv.BindingAdapter.onBindViewHolder(BindingAdapter.kt:178) at com.drake.brv.BindingAdapter.onBindViewHolder(BindingAdapter.kt:70) at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7337) at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6194) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6460) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668) at com.drake.brv.layoutmanager.HoverLinearLayoutManager.onLayoutChildren(HoverLinearLayoutManager.java:207) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4012) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1857) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1701) at android.widget.LinearLayout.onLayout(LinearLayout.java:1610) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:334) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1857) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1701) at android.widget.LinearLayout.onLayout(LinearLayout.java:1610) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1263) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:334) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) 2023-05-10 08:37:23.543 6342-6342/com.drake.brv.sample E/AndroidRuntime: at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1857) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1701) at android.widget.LinearLayout.onLayout(LinearLayout.java:1610) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:334) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1857) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1701) at android.widget.LinearLayout.onLayout(LinearLayout.java:1610) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:334) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at com.android.internal.policy.DecorView.onLayout(DecorView.java:1146) at android.view.View.layout(View.java:22496) at android.view.ViewGroup.layout(ViewGroup.java:6528) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3743) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3207) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2166) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8887) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1280) at android.view.Choreographer.doCallbacks(Choreographer.java:1019) at android.view.Choreographer.doFrame(Choreographer.java:911) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1248) at android.os.Handler.handleCallback(Handler.java:900) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:219) at android.app.ActivityThread.main(ActivityThread.java:8668)

liangjingkanji commented 1 year ago

@wlqjj0 让fork仓库复现问题, 不是让发截图

我现在只能猜测你的问题大概是 你用getBinding()但是你没有给布局添加layout标签, 导致自动去使用ViewBinding, 然后你又没有在gradle启用viewBinding

算是很低级的问题了

wlqjj0 commented 1 year ago

@liangjingkanji 这是跑的你的仓库代码 我看你也开启了 没开启没有layout标签怎么生成的viewBinding 单一类型为什么可以 多类型就不行

也算是很低级的诊断了

liangjingkanji commented 1 year ago

@liangjingkanji 这是跑的你的仓库代码 我看你也开启了 没开启没有layout标签怎么生成的viewBinding 单一类型为什么可以 多类型就不行

也算是很低级的诊断了

你fork后复现问题把地址给我吧, 既然demo仓库我觉得问题就很简单了

PengShaoLei97 commented 1 year ago

请问这个问题现在有解决方式了吗?因为我在项目中也碰到了同样的问题。使用getBinding去反射获取ViewBinding时报错。

liangjingkanji commented 1 year ago

请问这个问题现在有解决方式了吗?因为我在项目中也碰到了同样的问题。使用getBinding去反射获取ViewBinding时报错。

这个问题并没有被证明存在

项目是多module组件化项目吗? 请截图给我看下是否打开ViewBinding和Kapt

liangjingkanji commented 1 year ago

这个问题我修改sample代码复现了, 因为getBinding<ViewBinding>()使用的是接口泛型, 导致反射失败

由于sample中使用到R.layout.item_simple_text其被layout标签包裹, 导致被DataBinding填充所以不存在此崩溃问题

when (val viewBinding = getBinding<ViewBinding>()) {
    is ItemViewBindingBinding -> {
        viewBinding.tvSimple.text = layoutPosition.toString()
    }
    is ItemCommentBinding -> {
        viewBinding.tvContent.text = layoutPosition.toString()
    }
}

以上为错误多类型判断, 改为以下方式即可

when (itemViewType) {
    R.layout.item_view_binding -> {
        val viewBinding = getBinding<ItemViewBindingBinding>()
        viewBinding.tvSimple.text = layoutPosition.toString()
    }
    R.layout.item_comment -> {
        val viewBinding = getBinding<ItemCommentBinding>()
        viewBinding.tvContent.text = layoutPosition.toString()
    }
}

我会同步更新sample示例代码

liangjingkanji commented 1 year ago

该问题其实十分简单, 源码不到10行, 但是没有人真正去复现问题导致未发现问题, 所以我在提问模板中强调希望开发者fork仓库复现问题 本项目将近350个issues问题绝大部分全是寻求帮助做不到每个问题由作者去复现, 并且还需要维护文档/sample/其他开源项目

欢迎star项目让更多人参与/完善项目, 以及让我知道有多少人需要这个开源项目