CymChad / BaseRecyclerViewAdapterHelper

BRVAH:Powerful and flexible RecyclerAdapter
http://www.recyclerview.org/
MIT License
24.3k stars 5.15k forks source link

数据源为List时,调用add方法程序闪退 #3823

Closed wxw-9527 closed 10 months ago

wxw-9527 commented 10 months ago

如题,数据源为List类型时,直接调用add方法添加新数据,程序报异常 FATAL EXCEPTION: main Process: com.chad.baserecyclerviewadapterhelper, PID: 6013 java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at com.chad.library.adapter4.BaseQuickAdapter.removeAt(BaseQuickAdapter.kt:634) at com.chad.baserecyclerviewadapterhelper.activity.itemclick.ItemClickActivity.onCreate$lambda$6(ItemClickActivity.kt:69) at com.chad.baserecyclerviewadapterhelper.activity.itemclick.ItemClickActivity.$r8$lambda$N5IZmXMy-dmWH7oJn-Jo3dOV9ho(Unknown Source:0) at com.chad.baserecyclerviewadapterhelper.activity.itemclick.ItemClickActivity$$ExternalSyntheticLambda6.onItemClick(Unknown Source:0) at com.chad.library.adapter4.BaseQuickAdapter.onItemChildClick(BaseQuickAdapter.kt:394) at com.chad.library.adapter4.BaseQuickAdapter.bindViewClickListener$lambda$10$lambda$9$lambda$8(BaseQuickAdapter.kt:346) at com.chad.library.adapter4.BaseQuickAdapter.$r8$lambda$ccaijNo-c5lRG10m3T_rMqaIOnE(Unknown Source:0) at com.chad.library.adapter4.BaseQuickAdapter$$ExternalSyntheticLambda2.onClick(Unknown Source:4) at android.view.View.performClick(View.java:7380) at android.view.View.performClickInternal(View.java:7342) at android.view.View.access$3900(View.java:824) at android.view.View$PerformClick.run(View.java:28262) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:238) at android.app.ActivityThread.main(ActivityThread.java:7827) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)

复现方法: ItemClickActivity中,将数据源改为以下代码:

// 创建数据
        val data = listOf(
                    ClickEntity(ClickEntity.CLICK_ITEM_VIEW),
                    ClickEntity(ClickEntity.CLICK_ITEM_CHILD_VIEW),
                    ClickEntity(ClickEntity.LONG_CLICK_ITEM_VIEW),
                    ClickEntity(ClickEntity.LONG_CLICK_ITEM_CHILD_VIEW),
        )
        // 创建Adapter
        ItemClickAdapter(data)

调用add方法添加数据可复现

limuyang2 commented 10 months ago

listOf 创建的是 java.util.Collections.singletonList(element)

SingletonList<> 根据官方注释如下:

Returns an immutable list containing only the specified object. The returned list is serializable.

这是一个不可变化的列表,所以操作的时候,会抛出 UnsupportedOperationException 异常。

如果你已经确定了列表数据的不可变化特性,那么用 listOf 没有问题,操作数据抛出异常是对开发者的一种强制警告,符合设计逻辑。

如果你的列表数据是可以变化的,你应该使用 arrayListOf

开发者应自己确定数据列表是否可变,并显示的使用不同 list 类型