Android Kotlin开发:RecyclerView与Intent报错——未传入ListUserAdapter参数
解决RecyclerView适配器初始化参数缺失错误(No value passed for parameter 'ListUserAdapter')
问题根源
- 适配器构造参数未传递:你的
ListUserAdapter类构造函数要求传入ArrayList<User>作为数据源,但在MainActivity的setAdapter()方法中,你调用了无参构造ListUserAdapter(),直接触发参数缺失错误。 - 变量命名冲突:适配器内部的数据源变量名和类名重复(
private val ListUserAdapter: ArrayList<User>),既不符合Kotlin命名规范,也容易造成代码混淆。 - 初始化顺序错误:
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
相关产品推荐
相关产品推荐

