Android返回主Activity后ListView未更新,新建实例却正常的问题
问题原因与解决方案
问题根源
- 启动时机与数据传递逻辑错误:你使用
startActivity()启动InputPicture后,立刻调用了updateLists()和notifyDataSetChanged()。但startActivity()是异步操作,此时InputPicture还未完成图片选择与提交,主Activity的getIntent()获取的是最初启动它的原始Intent,根本没有imageFromInput这个额外参数,所以listOfImages不会添加新内容。 - 新实例能更新的原因:当你从
InputPicture启动新的主Activity实例时,传递的Intent携带了imageFromInput参数,新实例的getIntent()能正常读取该数据,因此ListView会更新。但这种方式会导致主Activity多实例堆积,属于错误的实现方式。
正确实现步骤
1. 改用startActivityForResult(或AndroidX的registerForActivityResult)启动InputPicture
如果你的项目基于旧版Android(API < 30),修改按钮点击事件:
buttonAddPhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getApplicationContext(), InputPicture.class); // 自定义请求码,用于后续识别返回结果来源 startActivityForResult(intent, 100); // 移除此处的updateLists和notifyDataSetChanged调用,等待返回结果后再处理 } });
2. 重写onActivityResult接收返回数据并更新列表
在主Activity中添加如下方法:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 匹配请求码+确认操作成功+数据非空 if (requestCode == 100 && resultCode == RESULT_OK && data != null) { String imageFromInput = data.getStringExtra("imageFromInput"); if(imageFromInput != null){ Uri imageFromInputURI = Uri.parse(imageFromInput); listOfImages.add(imageFromInputURI); // 通知适配器更新列表 customBaseAdapter.notifyDataSetChanged(); } } }
3. 修改InputPicture的提交逻辑,设置返回结果
在InputPicture的提交按钮点击事件中,需将数据放入Intent并设置结果后再关闭页面:
// 示例:提交按钮点击事件 buttonSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String targetImageUri = "你获取到的图片Uri字符串"; // 替换为实际获取的图片Uri Intent resultIntent = new Intent(); resultIntent.putExtra("imageFromInput", targetImageUri); // 设置结果码为RESULT_OK,表示操作成功 setResult(RESULT_OK, resultIntent); finish(); } });
(可选)AndroidX推荐的registerForActivityResult方式
如果项目使用AndroidX,更推荐这种无回调冗余的实现:
// 在主Activity的onCreate中初始化结果回调 ActivityResultLauncher<Intent> inputPictureLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); if (data != null) { String imageFromInput = data.getStringExtra("imageFromInput"); if(imageFromInput != null){ Uri imageFromInputURI = Uri.parse(imageFromInput); listOfImages.add(imageFromInputURI); customBaseAdapter.notifyDataSetChanged(); } } } } ); // 按钮点击事件中启动页面 buttonAddPhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getApplicationContext(), InputPicture.class); inputPictureLauncher.launch(intent); } });
内容的提问来源于stack exchange,提问作者Kudor
相关产品推荐
相关产品推荐

