0

活性A和B含有RecyclerView和保持類似種類的數據,因此它們使用稱爲AViewModel訪問同一視圖模型在不同recyclerViews

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

現在關於開展活動A應用程序崩潰,並顯示

AdapterA不能轉換到適配器B

懷疑爲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) 在 機器人。 databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:379) 在 android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:351) 在android.databinding.ViewDataBinding $ 6.run(ViewDataBinding.java:178) 在 機器人.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 ) at android.view.ViewGroup.dispa tchAttachedToWindow(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) at android.view.Choreographer $ CallbackRecord.run(Choreographer.java:858) at 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) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main (ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(Zygo teInit.java:726) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

+0

粘貼您的完整錯誤日誌 –

回答

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

    } 
} 

讓我知道它是否會給出任何類型的錯誤。

+0

我想回答爲什麼發生這個問題。您正在定義兩個具有相同簽名和相同屬性的不同BindingAdapter。其中一個會一直覆蓋另一個,我想你甚至可能會看到一個警告,但我不完全確定。 另一種方法是對適配器屬性使用不同的屬性。 (例如,活動A使用「bind:adaptera」,活動B使用「bind:adapterb」) 在這個特定的實例中,您也可以讓這兩個適配器都實現一個與clearList(),addAll()和notifyDataSetChanged只能投射到該界面。 –

+0

@GeorgeMount是的,這是絕對正確的,我只是忘了選擇不同的屬性,謝謝你的建議。 –

相關問題