开发Google开发者Unit2 Dogglers应用时遇陌生错误求助
修复Dogglers应用RecyclerView Adapter的代码错误
核心问题分析
你的代码最关键的错误是把onCreateViewHolder方法误嵌套在了DogCardViewHolder内部,这完全不符合RecyclerView.Adapter的重写规则。此外还有几处细节问题需要调整:
DogCardViewHolder的构造参数无需设为可空,因为布局Inflate出来的View不可能为null- 布局类型判断应该用Adapter类传入的
layout变量,而非viewType参数 - 存在冗余的导入和重复变量声明
修正后的完整代码
package com.example.dogglers.adapter import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.example.dogglers.R import com.example.dogglers.const.Layout import com.example.dogglers.data.DataSource import com.example.dogglers.model.Dog /** * Adapter用于加载对应列表项布局,并从数据源填充视图信息 */ class DogCardAdapter( private val context: Context?, private val layout: Int ) : RecyclerView.Adapter<DogCardAdapter.DogCardViewHolder>() { // 初始化数据源 private val dogs = DataSource.dogs /** * 初始化列表项的UI组件 */ class DogCardViewHolder(view: View) : RecyclerView.ViewHolder(view) { val dogImageView: ImageView = view.findViewById(R.id.pics_of_dogs) val dogNameText: TextView = view.findViewById(R.id.dogs_name) val dogAgeText: TextView = view.findViewById(R.id.dogs_age) val dogHobbyText: TextView = view.findViewById(R.id.dogs_hobbies) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DogCardViewHolder { // 根据传入的布局类型选择对应的列表项布局 val adapterLayout = if (layout == Layout.GRID) { LayoutInflater.from(parent.context).inflate(R.layout.grid_list_item, parent, false) } else { LayoutInflater.from(parent.context).inflate(R.layout.vertical_horizontal_list_item, parent, false) } return DogCardViewHolder(adapterLayout) } override fun getItemCount(): Int = dogs.size override fun onBindViewHolder(holder: DogCardViewHolder, position: Int) { val dogData = dogs[position] holder.dogImageView.setImageResource(dogData.imageResourceId) holder.dogNameText.text = dogData.name val resources = context?.resources holder.dogAgeText.text = resources?.getString(R.string.dog_age, dogData.age) holder.dogHobbyText.text = resources?.getString(R.string.dog_hobbies, dogData.hobbies) } }
关键修正点说明
- 把
onCreateViewHolder移到DogCardAdapter类顶层,作为重写方法,这是RecyclerView Adapter的强制要求 - 移除
DogCardViewHolder及内部UI组件的可空符号,避免不必要的空安全处理 - 布局判断逻辑改为使用Adapter构造时传入的
layout变量,而非viewType(本场景无需多类型Item,布局由外部传入决定) - 清理了冗余的导入(如
kotlinx.coroutines.selects.select、GridLayout)和重复的dogs变量声明
内容的提问来源于stack exchange,提问作者codingNoob
相关产品推荐
相关产品推荐

