Android Kotlin RecyclerView存值后MenuItem跳转第二页值为空问题求助
问题根源
- 列表项点击事件未同步选中的国家数据到MainActivity:你在适配器里点击列表项仅构造了Intent但没有跳转,也没有将当前点击的Medal数据回传给MainActivity更新全局变量,MainActivity里的
medal全局变量仅在初始化读取本地数据时被赋值,永远只存列表最后一条国家数据。 - 跳转时未携带参数:MainActivity点击菜单跳转DetailActivity的代码中,给Intent传
name和abbr的两行代码被注释了,DetailActivity从Intent拿不到参数自然显示空值。
修复方案
第一步:给适配器添加点击回调,回传选中的Medal数据
修改MedalAdapter构造方法,新增点击回调参数:
class MedalAdapter( private val context: Context, private val datalist: MutableList<Medal>, // 新增点击回调,将选中的Medal回传 private val onItemClick: (Medal) -> Unit ): RecyclerView.Adapter<MedalAdapter.ViewHolder>() {
修改适配器中ViewHolder的bind方法内的点击事件,移除无用的Intent构造逻辑,触发回调:
v.setOnClickListener{ Toast.makeText(v.context, toast, Toast.LENGTH_SHORT).show() // 回传当前点击的国家数据 onItemClick(item) Log.i("Click Event", "name: " + item.name) Log.i("Click Event", "medal: " + item) }
第二步:MainActivity接收回调更新选中数据
修改MainActivity中初始化适配器的代码,传入回调更新全局medal变量:
medallist.adapter = MedalAdapter(this, datalist) { clickedMedal -> // 每次点击列表项,更新全局保存的选中国家数据 medal = clickedMedal }
第三步:取消传参代码的注释
修改MainActivityonOptionsItemSelected方法,取消两行传参代码的注释,还可以添加边界判断避免未选国家直接点菜单崩溃:
override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.save -> { if (!this::medal.isInitialized) { Toast.makeText(this, "请先选择一个国家", Toast.LENGTH_SHORT).show() return true } val intent = Intent(this, DetailActivity::class.java) Log.i("Medal", "name: " + medal.name) // 取消下面两行的注释,携带参数跳转 intent.putExtra("name", medal.name) intent.putExtra("abbr", medal.abbreviation) startActivity(intent) true } else -> super.onOptionsItemSelected(item) } }
修改完成后即可正常在DetailActivity拿到选中的国家信息展示。
内容的提问来源于stack exchange,提问作者Steven93
相关产品推荐
相关产品推荐

