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

RecyclerView适配器懒加载初始化引发ViewHolder空指针错误,求解决

RecyclerView适配器空指针问题排查与解决

问题背景

我有一个接收MyDataClass列表的RecyclerView适配器MyAdapter,用于渲染RecyclerView条目,相关代码如下:

适配器代码

class MyAdapter(private var adapterItems: MutableList<MyDataClass>): RecyclerView.Adapter<ViewHolder>(){

    override fun OnCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder{
        //Todo
    }

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int): ViewHolder {
       //Todo
    }

    override fun getItemCount(): Int {
       //Todo
    }

   inner class ViewHolder(
       itemView: View)
   : RecyclerView.ViewHolder(itemView)
}

对应数据类

data class MyDataClass(
    val id: Int,
    val title: String,
    val subTitle: String,
)

自定义Activity中适配器初始化

class Activity @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int): RecyclerView(context, attrs, defStyle){

        private val myAdapter: MyAdapter by lazy {
           MyAdapter(mutableListOf())
        }

        init{
            this.adapter = myAdapter
            //同时设置了布局管理器并初始化RecyclerView
        }
}

Fragment负责生成条目数据并传递给适配器,测试RecyclerView功能时出现以下错误:

Attempt to invoke virtual method 'boolean android.recyclerview.widget.RecyclerView$ViewHolder.shouldIgnore()' on a null object reference


问题原因与解决步骤

1. 修复onCreateViewHolder方法名拼写错误

你写的方法名是OnCreateViewHolder(首字母大写O),但RecyclerView.Adapter要求的正确方法名是onCreateViewHolder(首字母小写o)。拼写错误会导致系统无法正确创建ViewHolder实例,最终返回null触发空指针。

修正代码:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    // 加载条目布局并返回ViewHolder实例
    val view = LayoutInflater.from(parent.context).inflate(R.layout.your_item_layout, parent, false)
    return ViewHolder(view)
}

2. 修正onBindViewHolder方法返回值

onBindViewHolder的正确签名是无返回值(Unit),你的代码错误声明返回ViewHolder,导致方法重载不匹配,系统无法执行绑定逻辑。

修正代码:

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
    // 将数据绑定到ViewHolder的视图组件
    val item = adapterItems[position]
    // 示例:假设条目布局中有titleTextView和subTitleTextView
    viewHolder.itemView.titleTextView.text = item.title
    viewHolder.itemView.subTitleTextView.text = item.subTitle
}

3. 实现getItemCount方法

当前getItemCount未返回数据列表长度,RecyclerView无法知晓条目数量,会引发异常。

修正代码:

override fun getItemCount(): Int {
    return adapterItems.size
}

4. 数据更新时通知适配器

Fragment传递数据给适配器后,必须调用通知方法让RecyclerView刷新:

// Fragment中更新适配器数据的示例代码
fun updateAdapterData(newItems: List<MyDataClass>) {
    myAdapter.adapterItems.clear()
    myAdapter.adapterItems.addAll(newItems)
    myAdapter.notifyDataSetChanged()
}

内容的提问来源于stack exchange,提问作者Phani Teja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:00:46