其實這兩個錯誤一樣的:
錯誤日誌:
java.lang.IllegalStateException: Cannot set menu creator, setAdapter has already been called.
at com.yanzhenjie.recyclerview.SwipeRecyclerView.checkAdapterExist(SwipeRecyclerView.java:245)
at com.yanzhenjie.recyclerview.SwipeRecyclerView.setSwipeMenuCreator(SwipeRecyclerView.java:305)
at com.jfkj.im.adapter.MinefriendAdapter.onBindViewHolder(MinefriendAdapter.java:115)
at com.jfkj.im.adapter.MinefriendAdapter.onBindViewHolder(MinefriendAdapter.java:53)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at com.yanzhenjie.recyclerview.AdapterWrapper.onBindViewHolder(AdapterWrapper.java:200)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:22144)
at android.view.ViewGroup.layout(ViewGroup.java:6335)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1839)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1683)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1592)
at android.view.View.layout(View.java:22144)
at android.view.ViewGroup.layout(ViewGroup.java:6335)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:334)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:22144)
at android.view.ViewGroup.layout(ViewGroup.java:6335)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1839)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1683)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1592)
at android.view.View.layout(View.java:22144)
at android.view.ViewGroup.layout(ViewGroup.java:6335)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:334)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:22144)
at android.view.ViewGroup.layout(ViewGroup.java:6335)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1839)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1683)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1592)
at android.view.View.layout(View.java:22144)
at android.view.ViewGroup.layout(ViewGroup.java:6335)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:334)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:971)
at android.view.View.layout(View.java:22144)
at android.view.ViewGroup.layout(ViewGroup.java:6335)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3298)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2798)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1870)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8128)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1057)
2020-06-18 16:48:38.098 16842-16842/com.jfkj.vip E/AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:875)
at android.view.Choreographer.doFrame(Choreographer.java:776)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1042)
at android.os.Handler.handleCallback(Handler.java:894)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8210)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
我這裏是recyclerview嵌套recyclerview 報的錯,大概的字面意思就是監聽的方法不能再setadpter之前調用。
需要把監聽方法放在setadpter之前就好了。
但我這裏不同的是,我已經放在之前了,還是報錯了。也鬱悶了一會兒,無論放在那裏都是報錯。就想了一些方法,解決了問題,但是很雞肋,沒有使用,因爲這裏使用的是
SwipeRecyclerView 需要側滑
/**
* Set to create menu listener.
*/
public void setSwipeMenuCreator(SwipeMenuCreator menuCreator) {
if (menuCreator == null) return;
checkAdapterExist("Cannot set menu creator, setAdapter has already been called.");
this.mSwipeMenuCreator = menuCreator;
}
這裏會檢查適配器,看到這裏報錯的信息是一樣的,繼續走
/**
* Check the Adapter and throw an exception if it already exists.
*/
private void checkAdapterExist(String message) {
if (mAdapterWrapper != null) throw new IllegalStateException(message);
}
看到這裏會應該有點明白,如果這個適配器不是null的話就報上面的錯誤!因爲我這樣操作報錯的,在當前頁面沒有錯誤,而是點擊一個item之後進入另一個頁面,返回來的時候報錯,斷點查看,會繼續調用
onBindViewHolder方法,裏面就是嵌套的recyclerview,因爲第一次加載的時候,就已經設置了嵌套的recyclerview適配器,這裏進來的話就出現,這個嵌套的recycler已經有的,就報錯了。
解決方法:
holder.recyc_list.setAdapter(null);
holder.recyc_list.setSwipeMenuCreator(swipeMenuCreator);
holder.recyc_list.setLayoutManager(layoutManager);
在之前把適配器置null就好了!
SwipeRecyclerview使用中一些常見錯誤處理方法