点击按钮向ListView传值:跨Activity构建列表求助
解决多Activity传值到MainActivity更新ListView的方案
这是Android开发里很常见的跨页面传值+列表更新需求,我给你两种实用的实现方案,你可以根据自己的项目环境选择:
方案一:使用ActivityResultContracts(推荐,AndroidX 后官方主推)
这是Google现在推荐的替代传统startActivityForResult的方式,更灵活也更符合现代Android开发规范。
步骤1:MainActivity 准备列表和注册结果回调
首先在MainActivity里初始化ListView、数据源和适配器,然后注册一个ActivityResultLauncher来接收子Activity返回的数据:
class MainActivity : AppCompatActivity() { private lateinit var listView: ListView private lateinit var countryList: ArrayList<String> private lateinit var adapter: ArrayAdapter<String> // 注册接收子Activity返回结果的Launcher private val getCountryLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { // 获取子Activity返回的字符串 val countryName = result.data?.getStringExtra("COUNTRY_NAME") countryName?.let { // 添加到数据源并更新列表 countryList.add(it) adapter.notifyDataSetChanged() } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) listView = findViewById(R.id.listView) countryList = ArrayList() adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, countryList) listView.adapter = adapter // 跳转到EnglandActivity的按钮点击逻辑 findViewById<Button>(R.id.btn_go_england).setOnClickListener { val intent = Intent(this, EnglandActivity::class.java) getCountryLauncher.launch(intent) } // 跳转到MalaysiaActivity的按钮点击逻辑 findViewById<Button>(R.id.btn_go_malaysia).setOnClickListener { val intent = Intent(this, MalaysiaActivity::class.java) getCountryLauncher.launch(intent) } } }
步骤2:子Activity(比如EnglandActivity)返回数据
在子Activity的按钮点击事件里,把要传递的值通过Intent返回给MainActivity,然后关闭当前页面:
class EnglandActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_england) findViewById<Button>(R.id.btn_visit).setOnClickListener { // 创建返回数据的Intent val resultIntent = Intent() resultIntent.putExtra("COUNTRY_NAME", "England") // 设置结果码和数据 setResult(RESULT_OK, resultIntent) // 关闭当前Activity,回到MainActivity finish() } } }
MalaysiaActivity的代码几乎一样,只需要把"England"换成"Malaysia"就行。
方案二:使用传统的startActivityForResult(兼容旧版本)
如果你的项目还没迁移到AndroidX,或者习惯用旧方式,可以用这个:
步骤1:MainActivity 启动子Activity并处理返回结果
class MainActivity : AppCompatActivity() { private lateinit var listView: ListView private lateinit var countryList: ArrayList<String> private lateinit var adapter: ArrayAdapter<String> private val REQUEST_CODE_COUNTRY = 1001 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) listView = findViewById(R.id.listView) countryList = ArrayList() adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, countryList) listView.adapter = adapter findViewById<Button>(R.id.btn_go_england).setOnClickListener { val intent = Intent(this, EnglandActivity::class.java) startActivityForResult(intent, REQUEST_CODE_COUNTRY) } findViewById<Button>(R.id.btn_go_malaysia).setOnClickListener { val intent = Intent(this, MalaysiaActivity::class.java) startActivityForResult(intent, REQUEST_CODE_COUNTRY) } } // 重写onActivityResult接收返回数据 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_COUNTRY && resultCode == RESULT_OK) { val countryName = data?.getStringExtra("COUNTRY_NAME") countryName?.let { countryList.add(it) adapter.notifyDataSetChanged() } } } }
步骤2:子Activity返回数据
和方案一的子Activity代码完全一样,不需要改动。
注意事项
- 确保所有子Activity都在
AndroidManifest.xml里正确注册,比如:
<activity android:name=".EnglandActivity" /> <activity android:name=".MalaysiaActivity" />
- 每次添加数据后一定要调用
adapter.notifyDataSetChanged(),这样ListView才会刷新显示新数据。 - 如果需要传递更复杂的数据(不是简单字符串),可以用Parcelable或者Serializable,但这个需求里字符串就够了。
内容的提问来源于stack exchange,提问作者Hansini Lakshani
相关产品推荐
相关产品推荐

