Activity传递Map和List类型的数据

Activity间Map与List数据传递
本文探讨了Android应用中Activity之间如何通过Bundle传递包含Serializable对象的List和Map数据,并提供了具体的实现代码。

Activity传递Map和List类型的数据

距离上次发布博文已经过去3周之久了,间隔有点久了,一直想逼迫自己多写点儿文章但是,总被一些琐事打破。这周末正好两天时间都在下雨,周六差不多看了半天抖音视频,虽然感觉有点儿不务正业,但是既然抖音能吸引我的注意力,那自然有它存在的意义,抖音的崛起在一定程度上给了社会上年轻人表达自我的途径,也许这就是科技的力量吧。先说说我看抖音给我的感受吧,嘿嘿!看到有很多人拍的海很是美还有山也很是壮观,特别是配上背景音乐,有一种身临其境的感觉。对我感触最深的就是里面的发布的视频配上关于感情的价值观,真的,很是有道理,里面有一句我觉得写的比较好:“放弃一个喜欢很久的人是什么感觉,就像一把大火烧了你住了很久的房子,知道那是你家,却再也回不去了。”。时间来不及了,开始正事吧...写完还得早点睡觉。


我为什么要写这篇文章呢?就是因为有人的想法和我的想法不一样,我就喜欢钻牛角尖,所以我利用周末时间验证了下我的想法,就是关于Activity传递List中放入了实现了Serializable接口的对象元素,别人说另一个Activity接收时只能用Bundle的getSerializable()方法来接收,我验证过之后发现Bundle的getParcelableArrayList也可以获取到上一个Activity传递过来的数据,通过这件事情让我更加确信,很多事情只有你自己亲自做了你才会明白其中的道理。
验证完这个我又学了下Map的使用,以前没怎么使用过Map,这事还得从前几天项目中的业务逻辑说起,起先我用自己的想法完成项目的需求,到后来最后一步发现很难做了,然后项目老大过来说我的思路后期维护起来很是困难,然后项目老大就坐在我的位置上给我起了个头,按照他的思路重新写,当然后来发现了他那样写的好处,我在旁边静静的看着他写,不时和他说一两句,但更多的是崇拜,他写的很快而且思路很清晰,还指教导我以后写代码严谨点儿,突然觉得有人和我交流学术比我一个人在那折腾好多了。好了不说了,直接上代码!

第一个Activity:
package com.zhaichenyang.home.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.zhaichenyang.home.R;
import com.zhaichenyang.home.entity.PerDoor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;


/**
 * Created by Administrator on 2018/5/3 0003.
 */

public class TestActivity extends Activity implements View.OnClickListener {
    private static String TAG = TestActivity.class.getSimpleName();
    private Button mButton1;
    private             ArrayList<Integer> number          = new ArrayList<>(10);
    private             ArrayList<PerDoor> mData           = new ArrayList<>();
    private             boolean            isWanted        = false;
    private             String             StrJson         = "";
    public static final String             EXTRA_GOODSLIST = "goodslist";
    public static final String             EXTRA_MAPLIST   = "mapdata";
    private             Map<String,PerDoor> map             = new HashMap<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        initView();
        initData();
        initEvent();

    }

    private void initView() {
        mButton1 = findViewById(R.id.test_bt_1);
        mButton1.setOnClickListener(this);


    }

    private void initData() {
        //初始化数据
        for (int i = 0; i < 10; i++) {
            number.add(i);

        }


    }

    private void initEvent() {


    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.test_bt_1: {
                TestData();

            }
            break;
            default:
                break;
        }
    }

    private void TestData() {
        for (int b : number) {
            PerDoor p = new PerDoor();
            p.door = b;
            p.title = "zhai"+b;
            mData.add(p);
            map.put(p.door+"",p);
            if (b == 5) {

                //mData.add(b+"testData");

                break;

            }
            Log.e(TAG, "per_b: " + b);
            //不加if break;
            //per_b: 0,1,2,3,4,5,6,7,8,9
            //添加 break
            //per_b:0,1,2,3,4
        }
        isWanted = isWantedNumber();
        if (isWanted) {
            Log.e(TAG, "true_isWanted");

        } else {
            Log.e(TAG, "false_isWanted");

        }

        Intent intent = new Intent(TestActivity.this,AcceptActivity.class);
        Bundle bundle = new Bundle();
        //EXTRA_GOODSLIST
        bundle.putSerializable(EXTRA_GOODSLIST,mData);
        bundle.putSerializable(EXTRA_MAPLIST, (Serializable) map);


        intent.putExtras(bundle);
        startActivity(intent);



    }

    private boolean isWantedNumber() {
        //for语句中可以使用break;语句跳出循环
        for (int u : number) {
            if (u == 9) {
                return true;
            }
            Log.e(TAG, "u_is_what: " + u);
        }
        return false;

    }
}
第二个Activity:
import java.util.Set;

import static com.zhaichenyang.home.activity.TestActivity.EXTRA_GOODSLIST;
import static com.zhaichenyang.home.activity.TestActivity.EXTRA_MAPLIST;

/**
 * Created by ${} on 2018/5/6.
 */

public class AcceptActivity extends Activity {
    private Intent                       intent;
    private ArrayList<? extends PerDoor> mPerDoors;
    private ArrayList<PerDoor>           mPerDoors2;
    private Map<String, PerDoor>         map;
    private String TAG = AcceptActivity.class.getSimpleName();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_accept);
        intent = this.getIntent();
        Bundle bundle = intent.getExtras();
        mPerDoors = bundle.getParcelableArrayList(EXTRA_GOODSLIST);
        mPerDoors2 = (ArrayList<PerDoor>) bundle.getSerializable(EXTRA_GOODSLIST);
        map = (Map<String, PerDoor>) bundle.get(EXTRA_MAPLIST);

        initView();
        initData();
        initEvent();
    }

    private void initView() {


    }

    private void initData() {
        for (PerDoor p : mPerDoors) {
            Log.e(TAG, "door: " + p.door + "   title:  " + p.title);

        }
        //mPerDoors2
        for (PerDoor d : mPerDoors2) {
            Log.e(TAG, "door_s:  " + d.door + "   title_s:   " + d.title);

        }

        Set<Map.Entry<String, PerDoor>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, PerDoor>> meIt     = entrySet.iterator();
        while (meIt.hasNext()) {
            Map.Entry<String, PerDoor> entry = meIt.next();
           Log.e(TAG,entry.getKey() + "=" + entry.getValue().title);
        }
        for (String key : map.keySet()) {
            Log.e(TAG,"key_keySet:   "+key + "=" + map.get(key));
        }
        Log.e(TAG,"singleGet: "+map.get("1").title);



    }
    //遍历Map
    //Set<Map.Entry<String,  PerDoor>> set = map.entrySet();



    private void initEvent() {

    }
}
Bean类:
package com.zhaichenyang.home.entity;

import java.io.Serializable;

/**
 * Created by ${} on 2018/5/6.
 */

public class PerDoor implements Serializable {
   public int door;
   public String title ;
    public PerDoor(){
        title = "";
    }
//    public int setDoor(int d){
//        return this.door = d;
//
//    }
}







<think> 嗯,用户现在想知道如何在Android的两个Activity之间传递集合。我先梳理一下用户的问题核心点是什么。用户提到的引用内容里,引用[1]引用[2]都涉及传递对象集合,但具体实现方法需要整理。 首先,回忆Android中Activity传递数据的基本机制。通常使用IntentBundle来传递数据。Bundle可以存放各种数据类型,包括基本类型、String、Parcelable对象等。集合的话,比如ArrayList,也需要确保其中的元素是可序列化的。 用户引用[2]里的例子展示了传递Bundle的方法,通过putExtra放入Bundle,再通过Intent传递。但那个例子传递的是基本类型数据,用户需要的是传递集合。所以需要扩展这个思路,检查集合是否可序列化。 例如,如果要传递ArrayList,里面的元素必须实现Parcelable或Serializable接口。常见的做法是使用Parcelable,因为它在Android上效率更高。不过Serializable更简单,适合简单场景。需要分情况说明。 接下来,考虑实现步骤。发送方Activity创建Intent,准备集合数据,确保集合元素可序列化,然后用intent.putExtra()传递。接收方则在onCreate()中通过getIntent()获取数据,并转换回集合类型。这里要注意类型转换的安全,避免ClassCastException。 另外,用户可能遇到的坑是集合元素没实现序列化接口导致崩溃。需要强调这一点,并给出示例代码。比如自定义对象如何实现Parcelable,包括writeToParcel方法、CREATOR等。 然后,对比ParcelableSerializable的优缺点,帮助用户根据情况选择。比如Parcelable代码量多但高效,适合大量数据;Serializable简单但性能稍差。 还要考虑其他集合类型,如HashMap,同样需要元素可序列化。传递方法类似,用putExtra时的key对应获取即可。 可能用户会问集合大小限制的问题。Intent传递数据有大小限制,超过1MB可能导致TransactionTooLargeException。这时候需要建议其他方式,比如全局变量、持久化存储或EventBus等框架。不过用户当前问题集中在集合传递,所以先提一下限制,但不展开。 最后,整理代码示例,分开发送接收两部分的代码。使用ArrayList作为例子,元素为自定义的User类,展示如何实现Parcelable。同时补充Serializable的简化方案,让用户有选择余地。 还要注意引用标记,用户提供的引用[1][2]需要对应到回答中合适的地方,比如传递Bundle的方法来自引用[2]。确保回答符合用户要求的格式,特别是LaTeX部分不需要,因为这里是代码示例。 总结步骤:1. 集合元素实现序列化接口;2. 发送方用putExtra放入集合;3. 接收方获取并转换类型。关键点是序列化的实现方式注意事项。 </think> 在 Android 的 Activity 之间传递集合,核心方法是使用 `Intent` `Bundle`,**关键在于确保集合内的元素是可序列化的**(如基本类型、`String` 或实现了 `Parcelable`/`Serializable` 接口的对象)。以下是具体实现方法代码示例: --- ### **实现步骤** 1. **发送方 Activity (例如 MainActivity)**: - 创建 `Intent` 对象指向目标 Activity。 - 将集合放入 `Intent` 或 `Bundle`。 - 启动目标 Activity。 2. **接收方 Activity**: - 通过 `getIntent()` 获取传递的 `Intent`。 - 从 `Intent` 中提取集合数据。 --- ### **代码示例** #### 1. **传递基本类型集合(如 `ArrayList<String>`)** ```java // 发送方 Activity ArrayList<String> nameList = new ArrayList<>(); nameList.add("张三"); nameList.add("李四"); Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putStringArrayListExtra("key_name_list", nameList); // 专用方法传递String集合 startActivity(intent); ``` ```java // 接收方 Activity (SecondActivity) ArrayList<String> receivedList = getIntent().getStringArrayListExtra("key_name_list"); if (receivedList != null) { for (String name : receivedList) { Log.d("Received", "Name: " + name); } } ``` #### 2. **传递自定义对象集合(需实现 `Parcelable`)** ```java // 自定义对象实现 Parcelable (推荐Android高效序列化) public class User implements Parcelable { private String name; private int age; // 构造方法、Getter/Setter省略 protected User(Parcel in) { name = in.readString(); age = in.readInt(); } public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int size) { return new User[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } } ``` ```java // 发送方:传递 ArrayList<User> ArrayList<User> userList = new ArrayList<>(); userList.add(new User("张三", 25)); userList.add(new User("李四", 30)); Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putParcelableArrayListExtra("key_user_list", userList); // 专用方法传递Parcelable集合 startActivity(intent); ``` ```java // 接收方:获取 ArrayList<User> ArrayList<User> receivedUsers = getIntent().getParcelableArrayListExtra("key_user_list"); if (receivedUsers != null) { for (User user : receivedUsers) { Log.d("Received", "User: " + user.getName()); } } ``` #### 3. **通用方法传递任意集合(使用 `Serializable`)** ```java // 自定义对象实现 Serializable (Java标准序列化,性能较低) public class Product implements Serializable { private String id; private String name; // 构造方法、Getter/Setter省略 } ``` ```java // 发送方:传递 ArrayList<Product> ArrayList<Product> productList = new ArrayList<>(); productList.add(new Product("P001", "手机")); Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("key_product_list", productList); // 直接传递Serializable集合 startActivity(intent); ``` ```java // 接收方:获取 ArrayList<Product> ArrayList<Product> receivedProducts = (ArrayList<Product>) getIntent().getSerializableExtra("key_product_list"); if (receivedProducts != null) { // 处理数据 } ``` --- ### **关键注意事项** 1. **性能选择**: - 优先使用 `Parcelable`:效率高,Android 专属优化(推荐)[^2]。 - `Serializable` 更简单,但序列化过程较慢,适合小数据量。 2. **集合类型限制**: - `putStringArrayListExtra()` 仅支持 `ArrayList<String>`。 - `putParcelableArrayListExtra()` 仅支持 `ArrayList<? extends Parcelable>`。 - 其他集合类型(如 `HashMap`)需转为 `Serializable` 传递: ```java HashMap<String, User> map = new HashMap<>(); intent.putExtra("key_map", (Serializable) map); ``` 3. **数据大小限制**: - Intent 传输数据上限约 1MB,超大数据需改用全局变量、数据库或文件共享。 --- ### **传递集合的多种方法对比** | **方法** | 适用场景 | 性能 | 复杂度 | |------------------------|-----------------------------------|--------|--------| | `putStringArrayListExtra()` | 仅限 `ArrayList<String>` | 高 | 低 | | `putParcelableArrayListExtra()` | 仅限 `ArrayList<Parcelable>` | 高 | 中 | | `putExtra(key, Serializable)` | 任意集合类型 | 低 | 低 | > **提示**:如果集合元素是复杂对象,务必正确实现 `Parcelable` 或 `Serializable` 接口,否则会抛出 `NotSerializableException`。 --- ### **相关问题** 1. 如何传递 `HashMap` 或 `LinkedList` 等非 `ArrayList` 集合? 2. `Parcelable` `Serializable` 在性能上有何具体差异? 3. 如何安全传递超大型数据集合(如超过 1MB)? [^1]: 引用自 Android Activity 数据传递基础概念 [^2]: 引用自 Bundle 与 Parcelable 的实现机制
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值