You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerViewAdapter搭配ArrayList运行时错误及列表增删问题求助

关于RecyclerViewAdapter的增删操作与初始化报错问题

近期学习Android Studio时遇到RecyclerViewAdapter相关问题:使用List能正常运行,但无法对列表进行增删操作,同时还出现初始化报错,想知道解决办法,以及是否需要改用ViewModel。

相关代码

Adapter代码

class recycledViewAdapter(private var itemmodellist: ArrayList<recycledviewitemmodel>): RecyclerView.Adapter<recycledViewAdapter.recycledViewHolder>() {
    // 省略ViewHolder及其他重写方法
}

Activity代码

val recycledview = binding.recycledview
val list: ArrayList<recycledviewitemmodel> = ArrayList()
for (i in 1..10){
    list.add(recycledviewitemmodel("item " + i.toString()))
}
val adapter = recycledViewAdapter(list)
recycledview.adapter = adapter
recycledview.layoutManager = LinearLayoutManager(this)

报错信息

Process: com.example.recycleview, PID: 6955
    java.lang.NoSuchMethodError: No direct method <init>(Ljava/util/List;)V in class Lcom/example/recycleview/recycledViewAdapter; or its super classes (declaration of 'com.example.recycleview.recycledViewAdapter' appears in /data/data/com.example.recycleview/code_cache/.overlay/base.apk/classes4.dex)
        at com.example.recycleview.MainActivity.onCreate(MainActivity.kt:25)
        at android.app.Activity.performCreate(Activity.java:8290)
        at android.app.Activity.performCreate(Activity.java:8269)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3657)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7898)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

解决方案

1. 修复初始化报错

这个报错多由编译缓存或类型匹配问题导致,可按以下步骤解决:

  • 清理编译缓存:点击Android Studio顶部菜单栏Build -> Clean Project,完成后再点击Rebuild Project重新编译。
  • 适配通用列表类型:将Adapter构造函数的参数类型从ArrayList改为MutableList,避免类型擦除引发的匹配问题:
    class recycledViewAdapter(private var itemmodellist: MutableList<recycledviewitemmodel>): RecyclerView.Adapter<recycledViewAdapter.recycledViewHolder>() {
        // 原有代码保持不变
    }
    

2. 实现列表增删操作

直接操作Activity中的列表不会自动通知Adapter更新UI,需在Adapter中封装增删方法并触发UI更新:

  • 在Adapter内添加以下方法:
    // 添加列表项
    fun addItem(item: recycledviewitemmodel) {
        itemmodellist.add(item)
        notifyItemInserted(itemmodellist.size - 1) // 通知Adapter插入新项
    }
    
    // 删除指定位置的列表项
    fun removeItem(position: Int) {
        if (position >= 0 && position < itemmodellist.size) {
            itemmodellist.removeAt(position)
            notifyItemRemoved(position) // 通知Adapter删除项
        }
    }
    
  • 在Activity中调用Adapter方法完成增删,示例:
    // 添加新项
    adapter.addItem(recycledviewitemmodel("新增item"))
    // 删除第0项
    adapter.removeItem(0)
    

3. 是否需要改用ViewModel?

ViewModel不是必须项,但属于Android架构最佳实践:

  • 仅做简单本地列表增删时,不用ViewModel也能实现功能。
  • 若需要在屏幕旋转等配置变化时保留数据,或数据来源涉及网络请求、数据库操作等复杂场景,ViewModel能管理数据生命周期、避免内存泄漏,建议使用。

内容的提问来源于stack exchange,提问作者120 099 101 105 110 103

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:55:25