【问题标题】:Serializable object to Arraylist of HashmapHashmap的Arraylist的可序列化对象
【发布时间】:2013-06-21 10:58:34
【问题描述】:

我正在开发一个 android 应用程序,我在 Listview 中显示联系人的所有姓名。

点击联系人列表视图,我需要在另一个列表视图中显示该联系人的相应号码。

这里的问题是,我把所有的数字都捆绑起来,然后发送另一个活动,也收到了这个包,但是收到的包是可序列化的对象。

所以,要在 Listview 中显示,我需要将其转换为 Hashmap 的 Arraylist。 我怎样才能做到这一点?

代码如下:

发送活动:

HashMap<String, String> Numbermap = new HashMap<String, String>();

Numbermap.put("numb",number);
Numbermap.put("type",type);

NumberList.add(Numbermap);

Intent intent = new Intent (ContactNames.this,ContactsPhoneNumbers.class);

intent.putExtra("map", NumberList);


startActivity(intent);

接收活动:

    Serializable Numbermap = new HashMap<String, String>();

    //  contNum = (TextView)findViewById(R.id.ContactNumber);

    Bundle bundle = getIntent().getExtras();

    Intent intent = getIntent();

    if(bundle!=null)
    {
        Numbermap = bundle.getSerializable("map");
    }

【问题讨论】:

    标签: java android serialization


    【解决方案1】:

    您使用键“map”输入意图,对象NumberList 我认为它是ArrayList 的一个实例。但是在您的活动ContactsPhoneNumbers 中,您尝试使用键“map”获取 HashMap 的一个实例,这是不正确的。

    这是你应该做的:

    ArrayList<HashMap<String, String>> numberList = null;
    Bundle bundle = getIntent().getExtras();
    Intent intent = getIntent();
    if(bundle!=null)
    {
        numberList = (ArrayList<HashMap<String, String>>) bundle.getSerializable("map");
    }
    

    【讨论】:

    • 我的坏。非常感谢您的帮助!
    【解决方案2】:

    我通过以下方式检查了您的代码。

    发送活动:

        HashMap<String, String> Numbermap = new HashMap<String, String>();
        ArrayList<HashMap<String, String>> NumberList = new ArrayList<HashMap<String, String>>();
        Numbermap.put("numb", "1");
        Numbermap.put("type", "type");
        NumberList.add(Numbermap);
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        intent.putExtra("map", NumberList);
        startActivity(intent);
    

    接收活动:

    ArrayList<HashMap<String, String>> NumberList = new ArrayList<HashMap<String, String>>();
            Bundle extras = getIntent().getExtras();
            NumberList = (ArrayList<HashMap<String, String>>) extras.get("map");
            System.out.println(NumberList.get(0));
    

    我的 logcat 输出是:

    06-21 17:14:59.729: I/System.out(1609): {numb=1, type=type}
    

    也许这会对你有所帮助。

    【讨论】:

      【解决方案3】:

      每个Serializable 对象在被另一个Activity 接收时被反序列化为相同的对象类型。直接投到ArrayList:

      ArrayList<HashMap<String, String>> numberList = (ArrayList<HashMap<String, String>>) bundle.getSerializable("map");
      

      注意:这会给你一个编译器警告,因为你转换了一个泛型类型。只要确保双方的类型匹配,它就可以被忽略或抑制。 通常,转换泛型类型很容易出错。更好的解决方案是使用包含数据的可序列化类,这样更安全:

      public class MyNumbersClass implements Serializable {
          private static final long serialVersionUID = 1L;
          private List<Map<String,String>> data;
      
          public MyNumbersClass(List<Map<String,String>> data) {
              this.data = data;
          }
      
          public MyNumbersClass() {
          }
      
          public List<Map<String,String>>> getData() {
              return data;
          }
      }
      

      然后只需创建此类的一个实例,将您的ArrayList 传递给构造函数。另一方面,将Serializable 转换为MyNumbersClass 并使用getData() 检索列表。

      【讨论】:

        猜你喜欢
        • 2014-02-10
        • 2013-01-18
        • 2015-03-18
        • 2015-09-28
        • 2014-07-10
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        相关资源
        最近更新 更多