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

Android:从其他Activity向ListView添加对象

用Parcelable实现跨Activity添加ListView数据的完整方案

嘿,我明白你现在的困境——想从另一个Activity把数据传到主Activity更新ListView,Parcelable是正确的路子,我给你一步步捋清楚怎么实现:

第一步:创建实现Parcelable的数据模型类

首先你需要一个承载数据的实体类,比如叫ListItem,把你需要的字段(主文本、描述、图片ID)都放进去,然后实现Parcelable接口,这样它就能通过Intent传递了。

public class ListItem implements Parcelable {
    private String mainText;
    private String description;
    private int imageResId; // 用资源ID存选中的图片

    // 普通构造器
    public ListItem(String mainText, String description, int imageResId) {
        this.mainText = mainText;
        this.description = description;
        this.imageResId = imageResId;
    }

    // Parcelable必备的构造器,用于从Parcel中读取数据
    protected ListItem(Parcel in) {
        mainText = in.readString();
        description = in.readString();
        imageResId = in.readInt();
    }

    // Parcelable的CREATOR,必须实现
    public static final Creator<ListItem> CREATOR = new Creator<ListItem>() {
        @Override
        public ListItem createFromParcel(Parcel in) {
            return new ListItem(in);
        }

        @Override
        public ListItem[] newArray(int size) {
            return new ListItem[size];
        }
    };

    // 把数据写入Parcel
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mainText);
        dest.writeString(description);
        dest.writeInt(imageResId);
    }

    // 返回内容描述,一般返回0就行
    @Override
    public int describeContents() {
        return 0;
    }

    // 生成getter方法,Adapter需要用到这些字段
    public String getMainText() {
        return mainText;
    }

    public String getDescription() {
        return description;
    }

    public int getImageResId() {
        return imageResId;
    }
}

第二步:处理添加数据的第二个Activity

在这个Activity里,你需要获取用户输入的内容,判断选中的RadioButton,然后把数据打包成ListItem,通过Intent传回主Activity。

假设你的布局里:

  • 主文本EditText的id是et_main_text
  • 描述EditText的id是et_description
  • 两个RadioButton的id是rb_image1和rb_image2
  • 添加按钮的id是btn_add

对应的Activity代码:

public class AddItemActivity extends AppCompatActivity {
    private EditText etMainText, etDescription;
    private RadioButton rbImage1, rbImage2;
    private Button btnAdd;

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

        // 初始化控件
        etMainText = findViewById(R.id.et_main_text);
        etDescription = findViewById(R.id.et_description);
        rbImage1 = findViewById(R.id.rb_image1);
        rbImage2 = findViewById(R.id.rb_image2);
        btnAdd = findViewById(R.id.btn_add);

        btnAdd.setOnClickListener(v -> {
            // 获取输入内容
            String mainText = etMainText.getText().toString().trim();
            String description = etDescription.getText().toString().trim();
            
            // 判断选中的图片
            int imageResId;
            if (rbImage1.isChecked()) {
                imageResId = R.drawable.image1; // 替换成你的图片资源ID
            } else if (rbImage2.isChecked()) {
                imageResId = R.drawable.image2;
            } else {
                // 可以设置默认图片,或者提示用户选择
                imageResId = R.drawable.default_image;
            }

            // 创建ListItem对象
            ListItem newItem = new ListItem(mainText, description, imageResId);

            // 用Intent传递数据
            Intent resultIntent = new Intent();
            resultIntent.putExtra("NEW_LIST_ITEM", newItem); // 定义一个键,后面主Activity要用到
            setResult(RESULT_OK, resultIntent); // 设置结果码为成功
            finish(); // 关闭当前Activity
        });
    }
}

第三步:主Activity接收数据并更新ListView

主Activity需要启动第二个Activity并接收返回的数据,然后更新Adapter和ListView。

方式1:传统的startActivityForResult(适合Android 10及以下,或者兼容旧代码)

public class MainActivity extends AppCompatActivity {
    private ListView listView;
    private CustomAdapter adapter;
    private ArrayList<ListItem> itemList; // 你的Adapter数据集合,必须是可变的ArrayList

    private static final int REQUEST_CODE_ADD_ITEM = 100; // 请求码,自己定义

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

        // 初始化ListView和Adapter
        itemList = new ArrayList<>();
        adapter = new CustomAdapter(this, itemList); // 你的自定义Adapter
        listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);

        // 假设你有个"添加"按钮启动AddItemActivity
        Button btnLaunchAdd = findViewById(R.id.btn_launch_add);
        btnLaunchAdd.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, AddItemActivity.class);
            startActivityForResult(intent, REQUEST_CODE_ADD_ITEM);
        });
    }

    // 接收返回的数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_ADD_ITEM && resultCode == RESULT_OK && data != null) {
            // 获取传递回来的ListItem
            ListItem newItem = data.getParcelableExtra("NEW_LIST_ITEM");
            if (newItem != null) {
                // 添加到数据集合
                itemList.add(newItem);
                // 通知Adapter更新
                adapter.notifyDataSetChanged();
            }
        }
    }
}

方式2:AndroidX的registerForActivityResult(推荐,替代startActivityForResult)

如果你的项目用了AndroidX,更推荐用这个新的API:

public class MainActivity extends AppCompatActivity {
    private ListView listView;
    private CustomAdapter adapter;
    private ArrayList<ListItem> itemList;

    // 定义ActivityResultLauncher
    private ActivityResultLauncher<Intent> addItemLauncher;

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

        // 初始化数据和Adapter
        itemList = new ArrayList<>();
        adapter = new CustomAdapter(this, itemList);
        listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);

        // 初始化Launcher
        addItemLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == RESULT_OK) {
                        Intent data = result.getData();
                        if (data != null) {
                            ListItem newItem = data.getParcelableExtra("NEW_LIST_ITEM");
                            if (newItem != null) {
                                itemList.add(newItem);
                                adapter.notifyDataSetChanged();
                            }
                        }
                    }
                }
        );

        // 启动AddItemActivity
        Button btnLaunchAdd = findViewById(R.id.btn_launch_add);
        btnLaunchAdd.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, AddItemActivity.class);
            addItemLauncher.launch(intent);
        });
    }
}

最后检查你的自定义Adapter

确保你的Adapter能正确使用ListItem的字段来渲染列表项,比如在getView方法里获取mainText、description和imageResId来设置TextView和ImageView的内容。

这样一套流程走下来,你就能从第二个Activity成功添加数据到主Activity的ListView里啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:22:04