Доступ к одной и той же модели ViewModel в различных окнах реселлера

Упражнения 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();
    }
}

Деятельность B.java

 @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();
    }
}

Теперь при запуске Activity A приложение вылетает и показывает

AdapterA не может быть приведен к AdapterB

Подозреваю аналогичную сигнатуру метода для setAdapter. Любое предположение, что может быть причиной проблемы?

Журналы ошибок

E/AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: ком. .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.ViewDataBindingInecu (ViewDataBinding.java:379) в android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:351) в android.databinding.ViewDataBinding$6.run(ViewDataBinding.java:178) в android.databinding.ViewDataBindingTDWDB.T ообозначения $5.on Java:146) в android.view.View.dispatchAttachedToWindow(View.java:14531) в android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2836) в android.view.ViewGroup.dispatchAttachedToWindow (ViewGroup.jpg) android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843) в android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843) в android.view.ViewGroup.dispatchAttachedToWindow (ViewGroup.jroup.roid): android: 28: 28.dispatchAttach edToWindow (ViewGroup.java:2843) в android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1364) в android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) в android.view.RoRunotImp.java:6013) на android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) на android.view.Choreographer.doCallbacks(Choreographer.java:670) на android.view.Choreographer.doFrame(Хореограф: хореограф 606) на android.view.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)

1 ответ

Вместо определения двух @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();

    }
}

Дайте мне знать, если это дает какую-либо ошибку.

Другие вопросы по тегам