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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:55:28