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

Android Kotlin开发:RecyclerView与Intent报错——未传入ListUserAdapter参数

解决RecyclerView适配器初始化参数缺失错误(No value passed for parameter 'ListUserAdapter')

问题根源

  1. 适配器构造参数未传递:你的ListUserAdapter类构造函数要求传入ArrayList<User>作为数据源,但在MainActivity的setAdapter()方法中,你调用了无参构造ListUserAdapter(),直接触发参数缺失错误。
  2. 变量命名冲突:适配器内部的数据源变量名和类名重复(private val ListUserAdapter: ArrayList<User>),既不符合Kotlin命名规范,也容易造成代码混淆。
  3. 初始化顺序错误:MainActivity中先初始化适配器,再准备数据,导致数据无法正确传递给适配器。

修复步骤

1. 修正ListUserAdapter的数据源命名与构造

将适配器内的数据源变量名改为符合规范的users,并统一替换所有引用:

class ListUserAdapter(private val users: ArrayList<User>) : RecyclerView.Adapter<ListUserAdapter.ListViewHolder>() {
    private lateinit var onItemClickCallBack: OnItemClickCallBack

    fun setOnItemClickCallback(onItemClickCallback: OnItemClickCallBack) {
        this.onItemClickCallBack = onItemClickCallback
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder {
        val view: View = LayoutInflater.from(parent.context).inflate(R.layout.row_user, parent, false)
        return ListViewHolder(view)
    }

    override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
        val (name, username) = users[position]
        holder.tvName.text = name
        holder.tvUserName.text= username
        holder.itemView.setOnClickListener {
            onItemClickCallBack.onItemClicked(users[holder.adapterPosition])
        }
    }

    override fun getItemCount(): Int = users.size

    class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var tvName: TextView = itemView.findViewById(R.id.tv_username)
        var tvUserName: TextView = itemView.findViewById(R.id.tv_name)
    }

    interface OnItemClickCallBack {
        fun onItemClicked(data : User)
    }
}

2. 调整MainActivity的初始化逻辑

  • 先执行数据准备流程,再初始化适配器并传入数据源
  • 补充遗漏的布局设置代码,回收TypedArray避免内存泄漏:
class MainActivity : AppCompatActivity() {

    private lateinit var adapter: ListUserAdapter
    private lateinit var dataName: Array<String>
    private lateinit var dataUsername: Array<String>
    private lateinit var dataLocation: Array<String>
    private lateinit var dataRepo: Array<String>
    private lateinit var dataCompany: Array<String>
    private lateinit var dataFollowers: Array<String>
    private lateinit var dataFollowing: Array<String>
    private lateinit var dataPhoto: TypedArray
    private var users = arrayListOf<User>()
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root) // 补充布局设置
        prepare()
        addItem()
        setAdapter() // 数据准备完成后再初始化适配器
    }

    private fun setAdapter() {
        adapter = ListUserAdapter(users) // 传入已准备好的数据源
        with(binding) {
            rvList.adapter = adapter
            rvList.layoutManager = GridLayoutManager(this@MainActivity, 2, GridLayoutManager.HORIZONTAL, false)
            rvList.setHasFixedSize(true)
        }
        adapter.setOnItemClickCallback(object : ListUserAdapter.OnItemClickCallBack{
            override fun onItemClicked(user: User) {
                val intent = Intent(this@MainActivity, DetailActivity::class.java)
                intent.putExtra(DetailActivity.KEY_USER, user)
                startActivity(intent)
            }
        })
    }

    private fun prepare() {
        dataName = resources.getStringArray(R.array.name)
        dataUsername = resources.getStringArray(R.array.username)
        dataPhoto = resources.obtainTypedArray(R.array.avatar)
        dataLocation = resources.getStringArray(R.array.location)
        dataRepo = resources.getStringArray(R.array.repository)
        dataCompany = resources.getStringArray(R.array.company)
        dataFollowers = resources.getStringArray(R.array.followers)
        dataFollowing = resources.getStringArray(R.array.following)
    }

    private fun addItem() {
        for (position in dataName.indices) {
            val user = User(
                dataUsername[position],
                dataName[position],
                dataLocation[position],
                dataCompany[position],
                dataRepo[position],
                dataFollowers[position],
                dataFollowing[position],
                dataPhoto.getResourceId(position, -1)
            )
            users.add(user)
        }
        dataPhoto.recycle() // 回收TypedArray资源
    }
}

3. 确保User类实现Parcelable接口

因为你通过Intent传递User对象,必须让User类实现Parcelable,否则跳转后无法正确获取数据:

data class User(
    val username: String,
    val name: String,
    val location: String,
    val company: String,
    val repo: String,
    val followers: String,
    val following: String,
    val photo: Int
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readInt()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(username)
        parcel.writeString(name)
        parcel.writeString(location)
        parcel.writeString(company)
        parcel.writeString(repo)
        parcel.writeString(followers)
        parcel.writeString(following)
        parcel.writeInt(photo)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }

        override fun newArray(size: Int): Array<User?> {
            return arrayOfNulls(size)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:48:30