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
在自定义viewholder中 嵌套 recyclerview 时会出现 findviewbyid(R.id.recyclerview) 为空的情况,而且点击加载更多会报ClassCastException #1240
Comments
用的是楼主最新的版本测试的,可以试试
} |
为什么要复写createBaseViewHolder这个方法? |
@FrankKwok 复写是为了写databinding 我试过只要复写了 createBaseViewHolder(view) 内容什么都不改,只写一个super,都会crash |
我觉得实际上是有可能出现重写该方法的情况,毕竟每个人的用途不同,而且你自己也标注了 if you want to use subclass of BaseViewHolder in the adapter, you must override the method to create new ViewHolder。出现问题不可怕,问题是怎么解决。 |
@MirkoWu 复写了 createBaseViewHolder(view) 内容什么都不改,只写一个super,都会crash,这里crash的错误能贴出来吗 |
@FrankKwok java.lang.ClassCastException: com.chad.library.adapter.base.BaseViewHolder cannot be cast to com.chad.baserecyclerviewadapterhelper.adapter.TestAdapter$ViewHolder |
@FrankKwok 而且发现了 @OverRide @OverRide 但是三个都会报都这个异常 |
好的,我写个demo试一下 |
@MirkoWu 为什么我这里没问题呢 |
@MirkoWu 修改了一下,都复现了。。。 |
我就说。。。,我都折腾一天了,实在解决不了没办法才来问你们 |
而且我试过 即使不重写creatBaseViewholder ,我把databinding 的设置放到你写的那样里 |
@MirkoWu 这个异常java.lang.reflect.InvocationTargetException我已经知道原因了,是因为,复写方法后LoadingView用的也是ViewHolder,从LoadingView里是找不到R.id.mRecyclerView的,会触发NPE,引起这个异常 |
@MirkoWu 这些个异常全是因为从LoadingView里是找不到R.id.mRecyclerView引起的 |
@FrankKwok 嗯嗯,这里的异常虽说被catch到了,一般情况是不会出现问题的,除了重写才会暴露出来 |
@MirkoWu 你可以把需要做的操作方onCreateDefViewHolder这里,这里只是data集合的Item,不包含header、footer、loadMore |
@FrankKwok 我试过,但是onCreateDefViewHolder 里的参数获取不到layout,因为它是private |
@FrankKwok 要不然就得重写getDefItemViewType(),还是可以的,但感觉这只是零时的解决办法 |
|
java.lang.ClassCastException: com.chad.library.adapter.base.BaseViewHolder cannot be cast to com.chad.baserecyclerviewadapterhelper.adapter.TestAdapter$ViewHolder 这个是因为你的TestAdapter泛型还是BaseViewHolder,需要改为TestAdapter.ViewHolder |
@1109993488 他的泛型是对的, |
@1109993488 这样确实是可以的,但是我要使用databinding |
@FrankKwok 是的,所以目前的逻辑来讲,只要重写了viewholder,并且用了loadingview 就一定会出现转型异常 |
@MirkoWu 复写getItemView方法设置DataBinding是可行的 |
我在想是不是可以在执行代码之前先判断一下itemview的type类型 |
@FrankKwok 嗯嗯,我目前就是这么处理的,但是那个类型转换异常的还是存在的 |
@CymChad 在哪个方法前判断? |
|
你这个是不是想偏了,这个问题在于转换异常,为什么会有这个异常,是因为你把loadingview的holder当成了自定义那个,不信你看下源码,明明这些类型的holder就是BaseViewholder 你却要转成泛型的。
/**
|
不复写这个方法createBaseViewHolder是没有转换异常的 |
@MirkoWu 不要再构造方法里面获取子RecyclerView,在convert方法里获取 |
@FrankKwok 在holder中获取RecyclerView 是为了缓存adapter ,在convert方法里每一次都要setAdapter |
@MirkoWu 这样是不对的,你创建ViewHolder的时候并不知道要绑定哪个Adapter?如果不在convert里调用setAdapter,会导致视图错乱的 |
@FrankKwok 一个holder对应一个recycler 和adapter 怎么会错乱呢?我的问题目前已经解决了。 |
@MirkoWu holder是会被复用的,里面的recycler和adapter复用的时候没有做处理 |
在自定义viewholder中 嵌套 recyclerview 时会出现 findviewbyid(R.id.recyclerview) 为空的情况,
public class ViewHolder extends BaseRVHolder {
public ChildCommentAdapter childAdapter;
public RecyclerView childRcyclerView;
}
此时会有异常如下:
java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at com.mirkowu.baserecyclerviewadapterlibrary.BaseRVAdapter.createGenericKInstance(BaseRVAdapter.java:555)
at com.mirkowu.baserecyclerviewadapterlibrary.BaseRVAdapter.createBaseViewHolder(BaseRVAdapter.java:533)
at com.mirkowu.baserecyclerviewadapterlibrary.BaseRVAdapter.creatLoadingViewHolder(BaseRVAdapter.java:498)
at com.mirkowu.baserecyclerviewadapterlibrary.BaseRVAdapter.onCreateViewHolder(BaseRVAdapter.java:277)
at com.mirkowu.baserecyclerviewadapterlibrary.BaseRVAdapter.onCreateViewHolder(BaseRVAdapter.java:55)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6367)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5555)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3312)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3844)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:636)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1764)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1607)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1516)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1764)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1607)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1516)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:338)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1764)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1607)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1516)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:338)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1764)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1607)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1516)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:338)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2748)
at android.view.View.layout(View.java:16754)
at android.view.ViewGroup.layout(ViewGroup.java:5462)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2226)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1983)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6238)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:884)
at android.view.Choreographer.doCallbacks(Choreographer.java:696)
at android.view.Choreographer.doFrame(Choreographer.java:631)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:870)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5621)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
at com.softgarden.moduo.ui.comment.ViewHolder.(ViewHolder.java:25)
虽然报了异常 但程序还是可以正常运行的,
但问题在点击 底部的 加载更多item时(开启了上拉加载),就会报viewholder 转换异常 如下
java.lang.ClassCastException: com.mirkowu.baserecyclerviewadapterlibrary.BaseRVHolder cannot be cast to com.softgarden.moduo.ui.comment.ViewHolder
The text was updated successfully, but these errors were encountered: