Android跨Activity点击按钮填充ListView实现方案咨询
问题根源
你当前的实现无法追加条目是三个核心逻辑错误导致的:
- 每次从B跳转回A时,
onCreate里都会重新执行arrayList = new ArrayList<>(),之前存储的所有列表数据直接被清空,自然无法保留历史条目 - 用
static布尔值标记点击状态的设计本身就不可靠:static变量生命周期跟随应用进程,且你在B的onCreate末尾直接将buttonClicked重置为false,状态很容易被异常覆盖,还存在内存泄漏风险 - 你在B中点击按钮时是重新
startActivity启动了一个全新的MainActivity实例,而非回到之前已经打开的A页面,相当于每次操作都重启列表页,原有状态完全不会保留
实现方案
直接使用Android官方提供的页面结果返回机制即可,不需要自定义静态标记,也不需要手动新建Activity实例,修改步骤如下:
- 修改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; } } }
- 修改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
相关产品推荐
相关产品推荐

