【问题标题】:Accessing same ViewModel in different recyclerViews在不同的 recyclerViews 中访问相同的 ViewModel
【发布时间】:2017-08-02 04:34:23
【问题描述】:

Activity 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: 致命异常: main 进程: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) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 在 android.view.Choreographer.doCallbacks(Choreographer.java:670) 在 android.view.Choreographer.doFrame(Choreographer.java: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)

【问题讨论】:

  • 粘贴完整的错误日志

标签: android-recyclerview android-databinding android-binding-adapter


【解决方案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();

    }
}

如果有任何错误,请告诉我。

【讨论】:

  • 我想回答为什么会这样的问题。您正在定义两个具有相同签名和相同属性的不同 BindingAdapter。一个总是会覆盖另一个,我认为您甚至可能会看到警告,但我并不完全确定。另一种方法是对适配器属性使用不同的属性。 (例如,活动 A 使用“bind:adaptera”,活动 B 使用“bind:adapterb”)在这个特定的实例中,您还可以让两个适配器实现一个带有 clearList()、addAll() 和 notifyDataSetChanged() 的接口,并且只进行强制转换到那个界面。
  • @GeorgeMount 是的,完全正确,我只是忘记了不同属性的选项,谢谢建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多