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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:27:03