Cannot set item click listener, Cannot set menu creator ,setAdapter has already been called

其實這兩個錯誤一樣的:

錯誤日誌:

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使用中一些常見錯誤處理方法

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章