Доступ к одной и той же модели 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();
}
}
Дайте мне знать, если это дает какую-либо ошибку.