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

Android跨Activity点击按钮填充ListView实现方案咨询

问题根源

你当前的实现无法追加条目是三个核心逻辑错误导致的:

  • 每次从B跳转回A时,onCreate里都会重新执行arrayList = new ArrayList<>(),之前存储的所有列表数据直接被清空,自然无法保留历史条目
  • 用static布尔值标记点击状态的设计本身就不可靠:static变量生命周期跟随应用进程,且你在B的onCreate末尾直接将buttonClicked重置为false,状态很容易被异常覆盖,还存在内存泄漏风险
  • 你在B中点击按钮时是重新startActivity启动了一个全新的MainActivity实例,而非回到之前已经打开的A页面,相当于每次操作都重启列表页,原有状态完全不会保留
实现方案

直接使用Android官方提供的页面结果返回机制即可,不需要自定义静态标记,也不需要手动新建Activity实例,修改步骤如下:

  1. 修改Activity A(MainActivity)
    • 移除所有被static修饰的集合、适配器变量,不要用静态变量存储UI相关或业务数据
    • 注册页面结果回调,用来接收B返回的输入字符串
    • 仅在Activity首次创建时初始化集合和适配器,后续收到新数据直接追加到现有集合即可

改完的MainActivity代码:

package com.example.schoolapp;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    TextView tvSubjects;
    ListView listView;
    ArrayList<String> arrayList;
    ArrayAdapter<String> arrayAdapter;

    // 注册页面跳转结果回调
    ActivityResultLauncher<Intent> noteLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    // 收到B返回的有效数据时,追加到列表并刷新
                    if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                        String subject = result.getData().getStringExtra("Subject");
                        if (subject != null && !subject.isEmpty()) {
                            arrayList.add(subject);
                            arrayAdapter.notifyDataSetChanged();
                        }
                    }
                }
            }
    );

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvSubjects = findViewById(R.id.tv_subjects);
        listView = findViewById(R.id.listView);

        // 仅在初始化时创建一次集合和适配器
        arrayList = new ArrayList<>();
        arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
        listView.setAdapter(arrayAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        super.onOptionsItemSelected(item);
        switch (item.getItemId()){
            case R.id.item_newSubject:
                // 用带回调的方式启动B,不再用普通startActivity
                Intent intent = new Intent(this, NewNoteActivity.class);
                noteLauncher.launch(intent);
                return true;
            default:
                return false;
        }
    }
}
  1. 修改Activity B(NewNoteActivity)
    • 删掉静态的buttonClicked标记变量,完全不需要这个状态位
    • 点击提交按钮时不要重新启动MainActivity,直接把输入内容放到返回Intent中,关闭当前页面即可自动回到之前的A页面

改完的NewNoteActivity代码:

package com.example.schoolapp;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

public class NewNoteActivity extends AppCompatActivity {

    EditText et_subject;
    Button btn_createSubject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_note);

        et_subject = findViewById(R.id.et_subject);
        btn_createSubject = findViewById(R.id.btn_createSubject);

        btn_createSubject.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String subject = et_subject.getText().toString().trim();
                if (!subject.isEmpty()) {
                    // 把输入内容塞进返回Intent
                    Intent resultIntent = new Intent();
                    resultIntent.putExtra("Subject", subject);
                    setResult(RESULT_OK, resultIntent);
                }
                // 关闭当前页面,回到原有的MainActivity
                finish();
            }
        });
    }
}

如果需要应用重启后依然保留列表内容,可以在追加数据的位置加一步本地持久化逻辑,比如把集合序列化为JSON存在SharedPreferences,或者用Room数据库存储条目,不需要改动现有页面交互逻辑。

内容的提问来源于stack exchange,提问作者jakob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:12:20