Android Studio(Kotlin): 如何通过Intent启动Activity并获取返回结果
解决Android Kotlin中Activity数据回传与RecyclerView动态更新问题
一、启动第二个Activity并获取用户输入返回
使用Activity Result API(推荐,替代已废弃的startActivityForResult)
- 在第一个Activity中注册Activity Result Launcher
在Activity的onCreate方法里初始化:private val addItemLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data // 获取从第二个Activity传回的数据 val newItemName = data?.getStringExtra("EXTRA_ITEM_NAME") val newItemDesc = data?.getStringExtra("EXTRA_ITEM_DESC") // 将新数据添加到你的数据源列表 newItemName?.let { val newItem = YourItemClass(name = it, desc = newItemDesc ?: "") yourDataSourceList.add(newItem) // 通知RecyclerView更新 yourAdapter.notifyItemInserted(yourDataSourceList.size - 1) } } } - 启动第二个Activity
点击添加按钮时调用:addButton.setOnClickListener { val intent = Intent(this, AddItemActivity::class.java) addItemLauncher.launch(intent) } - 在第二个Activity中返回用户输入
用户输入完成后(比如点击保存按钮),将数据放入Intent并返回:saveButton.setOnClickListener { val itemName = editTextName.text.toString().trim() val itemDesc = editTextDesc.text.toString().trim() if (itemName.isNotEmpty()) { val resultIntent = Intent() resultIntent.putExtra("EXTRA_ITEM_NAME", itemName) resultIntent.putExtra("EXTRA_ITEM_DESC", itemDesc) setResult(RESULT_OK, resultIntent) finish() } }
二、RecyclerView动态更新(添加/删除后刷新)
确保适配器具备数据源操作能力
- 自定义Adapter时,持有数据源的引用,并提供添加、删除方法:
class YourItemAdapter(private val itemList: MutableList<YourItemClass>) : RecyclerView.Adapter<YourItemAdapter.ViewHolder>() { // ... 其他ViewHolder和绑定逻辑省略 // 添加项目方法 fun addItem(item: YourItemClass) { itemList.add(item) notifyItemInserted(itemList.size - 1) // 高效更新,只刷新新增的条目 } // 删除项目方法 fun removeItem(position: Int) { itemList.removeAt(position) notifyItemRemoved(position) notifyItemRangeChanged(position, itemList.size) // 刷新后续条目的位置 } } - 调用适配器方法更新UI
- 添加时:在第一个Activity收到返回数据后,调用
yourAdapter.addItem(newItem) - 删除时:在RecyclerView的条目点击删除按钮时,调用
yourAdapter.removeItem(position)
- 添加时:在第一个Activity收到返回数据后,调用
注意事项
- 数据源必须是MutableList,这样才能动态修改
- 不要直接修改数据源后调用
notifyDataSetChanged()(虽然能生效但效率低),优先用notifyItemInserted/notifyItemRemoved这类定向更新方法 - 如果使用ViewModel管理数据源,确保数据变化时能通知到Activity/Fragment,再触发适配器更新
内容的提问来源于stack exchange,提问作者SmilingDread04
相关产品推荐
相关产品推荐

