Kotlin Android向数据类添加值致应用崩溃问题排查
问题排查与解决方案
崩溃原因分析
从崩溃日志可定位核心问题:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.widget.TextView.toString()' on a null object reference
问题根源有两点:
- 错误的布局导入:你在
MainActivity.kt中导入了kotlinx.android.synthetic.main.food_search_list.*,但food_search_list.xml是RecyclerView的item布局,MainActivity的布局是activity_main.xml,并不包含该布局里的控件,导致Restaurant等变量为null,调用toString()触发空指针异常。 - 错误的数据初始化逻辑:你试图通过控件的
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添加监听实现筛选功能:
- 在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 } })
- 实现筛选逻辑(基于餐品名称、餐厅、分类匹配):
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
相关产品推荐
相关产品推荐

