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

点击按钮向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:04:25