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

Kotlin Android向数据类添加值致应用崩溃问题排查

问题排查与解决方案

崩溃原因分析

从崩溃日志可定位核心问题:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.widget.TextView.toString()' on a null object reference

问题根源有两点:

  1. 错误的布局导入:你在MainActivity.kt中导入了kotlinx.android.synthetic.main.food_search_list.*,但food_search_list.xml是RecyclerView的item布局,MainActivity的布局是activity_main.xml,并不包含该布局里的控件,导致Restaurant等变量为null,调用toString()触发空指针异常。
  2. 错误的数据初始化逻辑:你试图通过控件的toString()填充数据,这完全不符合逻辑,应该直接传入实际的字符串内容。

分步修复方案

1. 移除错误的布局导入

打开MainActivity.kt,删除以下导入语句:

import kotlinx.android.synthetic.main.food_search_list.*

2. 修正mealData初始化代码

将创建mealData的代码改为直接传入真实文本内容,而非错误的控件调用:

dataList.add(mealData(
    mealName = "经典牛肉汉堡",
    restaurant = "麦当劳",
    mealImage = R.drawable.food1,
    mealCat = "快餐",
    mealDescription = "招牌汉堡,搭配新鲜生菜与特制酱料"
))

3. 修复Adapter的数据更新逻辑

当前PhotoAdapter的setDataList仅赋值未通知RecyclerView刷新,会导致列表不显示内容,修改如下:

internal fun setDataList(dataList: List<mealData>) {
    this.dataList = dataList
    notifyDataSetChanged() // 添加该行,通知RecyclerView刷新UI
}

4. 修复布局排版问题

food_search_list.xml中mealDescription控件的android:scaleX="45"会让文本被极度拉伸,完全不可读,建议删除该属性:

<TextView
    android:id="@+id/mealDescription"
    android:layout_width="168dp"
    android:layout_height="95dp"
    android:layout_marginStart="110dp"
    android:layout_marginTop="210dp"
    android:background="@color/white"
    android:padding="2dp"
    <!-- 删除 android:scaleX="45" -->
/>

搜索功能实现思路

完成基础修复后,可给SearchView添加监听实现筛选功能:

  1. 在MainActivity的onCreate方法中添加文本变化监听:
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
    override fun onQueryTextSubmit(query: String?): Boolean {
        filterData(query ?: "")
        return true
    }

    override fun onQueryTextChange(newText: String?): Boolean {
        filterData(newText ?: "")
        return true
    }
})
  1. 实现筛选逻辑(基于餐品名称、餐厅、分类匹配):
private fun filterData(query: String) {
    val filteredList = dataList.filter {
        it.mealName.contains(query, ignoreCase = true) ||
        it.restaurant.contains(query, ignoreCase = true) ||
        it.mealCat.contains(query, ignoreCase = true)
    }
    photoAdapter.setDataList(filteredList)
}

提示:若后续使用动态加载的数据,建议保留原始数据列表,筛选时基于原始列表操作,避免多次筛选导致数据丢失。

内容的提问来源于stack exchange,提问作者Strawberry Raen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:36:27