2012-07-10 43 views
0

我有一个全局定义的ArrayList为ArrayList<Map<String, String>> mContactList;迭代哈希映射ArrayList的难度为

现在,在方法之一,我定义一个HashMap是这样的:

Map<String, String> NamePhoneType = new HashMap<String, String>();  
NamePhoneType.put("Name", contactName); //contactName is returned from a query 
NamePhoneType.put("Phone", phoneNumber); //phoneNumber is returned from a query 
mContactList.add(NamePhoneType); 

所以mContactList现在看起来像[{Name=Abc, Phone=123}, {Name=def, Phone=456}...]

现在,当我尝试使用以下在mContactList迭代,根据索引,我始终将密钥的值设为'Phone',值为'123''456'

public void onItemClick(AdapterView<?> av, View v, int index,long arg) { 
    Map<String, String> map = (Map<String, String>) av.getItemAtPosition(index); 
    Iterator<String> myVeryOwnIterator = map.keySet().iterator(); 
    while (myVeryOwnIterator.hasNext()) { 
     String key = (String) myVeryOwnIterator.next(); 
     String value = (String) map.get(key); 
     getNumber.setText(value);          
     }    
    } 
}); 

我想要的Name和在2个单独的字符串的选择的索引的Phone。我怎么做?

+2

它真的好像你应该创建一个叫'ContactInfo'的* Name *,它具有'Name'和'Phone'成员。为什么在使模型具体化时使用任意键/值存储? – dlev 2012-07-10 21:25:19

回答

1

我不推荐创建一个叫做Contact的类。那么你的ArrayList将被宣布为

ArrayList<Contact> mContactList; 

Contact类会是什么样子

public class Contact { 
    private String name; 
    private String phoneNumber; 

    public Contact (String name, String phoneNumber) { 
     this.name = name; 
     this.phoneNumber = phoneNumber; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getPhoneNumber() { 
     return phoneNumber; 
    } 
} 

当你结束了嵌套的数据结构,它通常是一个标志重新考虑你的设计通常有一种更好的方式去做吧。


但是,要回答你的问题;注意这段代码在做什么。

Map<String, String> map = (Map<String, String>) av.getItemAtPosition(index); 
Iterator<String> myVeryOwnIterator = map.keySet().iterator(); 
while (myVeryOwnIterator.hasNext()) { 
    String key = (String) myVeryOwnIterator.next(); 
    String value = (String) map.get(key); 
    getNumber.setText(value);          
} 

您是通过地图,(似乎)迭代总是有两对:

"Name", nameValue 
"Phone", phoneValue 

没有必要通过地图迭代来得到你想要的值。你的代码应该看起来像:

Map<String, String> map = (Map<String, String>) av.getItemAtPosition(index); 
String phoneNumber = map.get("Phone"); 
String name = map.get("Name"); 
+0

非常感谢。你对我的问题的答案奏效。就建议而言,当我按照你所说的创建一个类时,如何在从查询中检索到名称和电话变量后,如何设置值? – Nerd 2012-07-10 21:44:03

+1

@Nerd添加一个构造函数(或setter方法,但如果你需要一个不可变的联系人,则构造函数更可取)。 – Will 2012-07-10 21:45:33

+1

更新了一下,希望这有点帮助:) – cklab 2012-07-10 21:48:47