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

开发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)
    }
}

关键修正点说明

  1. 把onCreateViewHolder移到DogCardAdapter类顶层,作为重写方法,这是RecyclerView Adapter的强制要求
  2. 移除DogCardViewHolder及内部UI组件的可空符号,避免不必要的空安全处理
  3. 布局判断逻辑改为使用Adapter构造时传入的layout变量,而非viewType(本场景无需多类型Item,布局由外部传入决定)
  4. 清理了冗余的导入(如kotlinx.coroutines.selects.select、GridLayout)和重复的dogs变量声明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:13:36