Android recyclerview 在不同的recyclerViews中访问相同的ViewModel

Android recyclerview 在不同的recyclerViews中访问相同的ViewModel,android-recyclerview,android-databinding,android-binding-adapter,Android Recyclerview,Android Databinding,Android Binding Adapter,活动A和B包含一个RecyclerView并保存类似类型的数据,因此它们使用称为AViewModel的公共视图模型 活动A.java @BindingAdapter("bind:adapter") public static void setAdapter(RecyclerView recyclerView, ArrayList<AViewModel> vm) { AdapterA adapter = ((AdapterA) recyclerView.getAdapter(

活动A和B包含一个RecyclerView并保存类似类型的数据,因此它们使用称为AViewModel的公共视图模型

活动A.java

 @BindingAdapter("bind:adapter")
public static void setAdapter(RecyclerView recyclerView, ArrayList<AViewModel> vm) {
    AdapterA adapter = ((AdapterA) recyclerView.getAdapter());
    if (adapter != null) {
        adapter.clearList();
        adapter.addAll(vm);
        adapter.notifyDataSetChanged();
    }
}
 @BindingAdapter("bind:adapter")
public static void setAdapter(RecyclerView recyclerView, ArrayList<AViewModel> vm) {
    AdapterB adapter = ((AdapterB) recyclerView.getAdapter());
    if (adapter != null) {
        adapter.clearList();
        adapter.addAll(vm);
        adapter.notifyDataSetChanged();
    }
}
@BindingAdapter(“绑定:适配器”)
公共静态void setAdapter(RecyclerView RecyclerView、ArrayList vm){
AdapterAdapter=((adapter)recyclerView.getAdapter());
if(适配器!=null){
adapter.clearList();
adapter.addAll(vm);
adapter.notifyDataSetChanged();
}
}
活动B.java

 @BindingAdapter("bind:adapter")
public static void setAdapter(RecyclerView recyclerView, ArrayList<AViewModel> vm) {
    AdapterA adapter = ((AdapterA) recyclerView.getAdapter());
    if (adapter != null) {
        adapter.clearList();
        adapter.addAll(vm);
        adapter.notifyDataSetChanged();
    }
}
 @BindingAdapter("bind:adapter")
public static void setAdapter(RecyclerView recyclerView, ArrayList<AViewModel> vm) {
    AdapterB adapter = ((AdapterB) recyclerView.getAdapter());
    if (adapter != null) {
        adapter.clearList();
        adapter.addAll(vm);
        adapter.notifyDataSetChanged();
    }
}
@BindingAdapter(“绑定:适配器”)
公共静态void setAdapter(RecyclerView RecyclerView、ArrayList vm){
AdapterB适配器=((AdapterB)recyclerView.getAdapter());
if(适配器!=null){
adapter.clearList();
adapter.addAll(vm);
adapter.notifyDataSetChanged();
}
}
现在启动活动A时,应用程序崩溃并显示

AdapterA不能转换为AdapterB

怀疑setAdapter的类似方法签名。 有什么建议可以说明问题的原因吗

错误日志

E/AndroidRuntime:致命异常:主 进程:com。hackthon.listviewpoc,PID:308 java.lang.ClassCastException:com。hackthon.listviewpoc.AdapterA 无法强制转换为com。hackthon.listviewpoc.AdapterB 在com.hackthon.listviewpoc.ActivityB.setAdapter上(ActivityB.java:39) 在 com.hackthon.listviewpoc.databinding.ActivityABinding.executeBindings(ActivityABinding.java:145) 在 android.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:379) 在 android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:351) 在android.databinding.ViewDataBinding$6.run(ViewDataBinding.java:178) 在 android.databinding.ViewDataBinding$5.onViewAttachedToWindow(ViewDataBinding.java:146) 在android.view.view.dispatchAttachedToWindow(view.java:14531) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2836) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843) 在android.view.ViewRootImpl.performTraversals上(ViewRootImpl.java:1364) 位于android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 在 Choreographer$CallbackRecord.run(Choreographer.java:858) 位于android.view.Choreographer.doCallbacks(Choreographer.java:670) 位于android.view.Choreographer.doFrame(Choreographer.java:606) 在 Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 位于android.os.Handler.handleCallback(Handler.java:739) 位于android.os.Handler.dispatchMessage(Handler.java:95) 位于android.os.Looper.loop(Looper.java:148) 位于android.app.ActivityThread.main(ActivityThread.java:5417) 位于java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)


不要定义两个
@BindingAdapter(“bind:adapter”)
,只需编写一次并使用
instanceof

@BindingAdapter("bind:adapter")
public static void setAdapter(RecyclerView recyclerView, ArrayList<AViewModel> vm) {
    if(recyclerView.getAdapter() instanceof AdapterA){
        AdapterA adapter = ((AdapterA) recyclerView.getAdapter());
        adapter.clearList();
        adapter.addAll(vm);
        adapter.notifyDataSetChanged();
    }
    else if(recyclerView.getAdapter() instanceof AdapterB){
        AdapterB adapter = ((AdapterB) recyclerView.getAdapter());
        adapter.clearList();
        adapter.addAll(vm);
        adapter.notifyDataSetChanged();

    }
}
@BindingAdapter(“绑定:适配器”)
公共静态无效setAdap