如何在第二个Activity中调用主Activity的Refresh()方法刷新ListView
安卓Java开发跨Activity更新主页面ListView的解决方案
错误方案原因说明
你之前两种尝试的问题本质:
- 把
Refresh()设为static:主Activity的Refresh()大概率会操作页面的ListView、上下文等非静态成员,static方法无法直接访问非静态成员,强制静态化还会导致内存泄漏,持有Activity实例无法被回收,必然触发崩溃 - 手动新建主Activity实例:安卓的Activity实例由系统Framework负责创建和生命周期管理,你手动new出来的实例没有绑定任何上下文、View树,也没有系统赋予的生命周期状态,调用相关方法直接触发空指针异常
正确实现方案
安卓原生提供了Activity之间回传结果的标准能力,推荐两种实现方式:
方案1:使用startActivityForResult(兼容低版本系统)
第一步:主Activity中跳转时携带请求码
在主Activity的add按钮点击事件中,不要用普通的startActivity(),改用startActivityForResult():
// 先定义全局请求码常量 private static final int REQUEST_ADD_ITEM = 1; // add按钮点击逻辑 addBtn.setOnClickListener(v -> { Intent intent = new Intent(MainActivity.this, AddItemActivity.class); startActivityForResult(intent, REQUEST_ADD_ITEM); });
第二步:主Activity重写onActivityResult处理返回结果
在主Activity中重写该方法,当新增条目的页面返回时触发,在这里调用你的Refresh()方法:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_ADD_ITEM && resultCode == RESULT_OK) { // 此处执行你的列表刷新逻辑 Refresh(); } }
第三步:第二个新增页面返回时设置结果码
在第二个Activity的onBackPressed()方法中,先设置返回结果再销毁页面:
@Override public void onBackPressed() { // 如果你需要把新增的条目数据回传给主页面,也可以把数据塞到Intent里 Intent resultIntent = new Intent(); // resultIntent.putExtra("new_item", 新增的条目数据); setResult(RESULT_OK, resultIntent); super.onBackPressed(); }
方案2:使用Activity Result API(安卓官方当前推荐,替代废弃的startActivityForResult)
第一步:主Activity中注册返回结果处理器
在主Activity的onCreate方法中提前注册:
private ActivityResultLauncher<Intent> addItemLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addItemLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { // 此处执行刷新逻辑 Refresh(); // 如果需要取返回数据:Intent data = result.getData(); } } ); // add按钮点击逻辑 addBtn.setOnClickListener(v -> { Intent intent = new Intent(MainActivity.this, AddItemActivity.class); addItemLauncher.launch(intent); }); }
第二步:第二个新增页面的逻辑和方案1完全一致,返回时设置resultCode即可
注意事项
- 你的
Refresh()方法中如果是重新读取数据源(比如本地数据库、内存里的列表数据)再给ListView的Adapter重新设置数据或者调用adapter.notifyDataSetChanged(),要确保数据源已经在新增页面被正确更新 - 如果新增操作需要本地持久化,建议在第二个Activity保存数据之后再设置返回结果,避免数据还没存完主页面就刷新拿不到新数据
内容的提问来源于stack exchange,提问作者Kwolo2
相关产品推荐
相关产品推荐

