2

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

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

这里的问题是,我捆绑了所有数字并将其发送到另一个活动并收到了捆绑包,但收到的捆绑包是可序列化的对象。

因此,要在 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");
    }
4

3 回答 3

3

您使用键“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");
}
于 2013-06-21T11:14:44.737 回答
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}

可能这会对你有所帮助。

于 2013-06-21T11:17:21.450 回答
0

每个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给构造函数。另一方面,将SerializabletoMyNumbersClass和 usegetData()用于检索列表。

于 2013-06-21T11:25:18.557 回答