Android开发:使用Adapter无法更新RecyclerView展示新增数据问题求助
问题排查与修复方案
你的代码存在4个核心问题导致列表不更新:
- 跳转逻辑错误:SecondActivity点击保存后直接启动新的
MainActivity实例,而不是将数据返回给原有MainActivity,栈内会堆积多个冗余的MainActivity实例 - 数据获取逻辑位置错误:新创建的Activity实例不会回调
onRestart生命周期,只有已存在的Activity从后台回到前台才会触发该方法,你写在onRestart里的新增数据逻辑根本不会执行 - 空安全隐患:直接对
getSerializableExtra的返回值强转,当不存在对应Extra时会触发空指针或类型转换异常 - (可选优化)全局调用
notifyDataSetChanged性能较差,可以用更精准的局部更新方法
修复步骤
1. 修改MainActivity,使用Activity Result API接收返回数据
替换原有跳转逻辑和onRestart里的错误代码:
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private val workoutList = mutableListOf( Workout("a","d","d","d"), Workout("a","d","d","d"), Workout("a","d","d","d") ) private val adaptor = WorkoutAdaptor(workoutList) // 注册数据返回回调 private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val workout = result.data?.getSerializableExtra("EXTRA_WORKOUT") as? Workout // 非空判断避免崩溃 workout?.let { workoutList.add(it) // 局部更新性能更好 adaptor.notifyItemInserted(workoutList.size - 1) } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.btnNext.setOnClickListener { val intent = Intent(this, SecondActivity::class.java) // 用注册好的回调启动SecondActivity startForResult.launch(intent) } binding.recyclerView.adapter = adaptor binding.recyclerView.layoutManager = LinearLayoutManager(this) } // 删掉原有错误的onRestart逻辑 }
2. 修改SecondActivity,保存后返回数据并关闭当前页面
替换btnSave的点击逻辑:
binding.btnSave.setOnClickListener { val workoutName = binding.tvWorkoutName.text.toString() val workoutType = spWorkoutsPosition.toString() val workoutIncrement = spIncrementsPosition.toString() val workoutRestTime = binding.etRestTime.text.toString() val workout = Workout(workoutName, workoutType, workoutIncrement, workoutRestTime) // 设置返回数据 val resultIntent = Intent() resultIntent.putExtra("EXTRA_WORKOUT", workout) setResult(RESULT_OK, resultIntent) // 关闭当前SecondActivity,回到原有MainActivity finish() }
注意:请确保你的
Workout类已经实现了Serializable或Parcelable接口,否则Intent传参会抛出异常。
内容的提问来源于stack exchange,提问作者Eleris
相关产品推荐
相关产品推荐

