我有Arraylist
HashMap
。每个HashMap
元素包含两列:列名和相应的值。此HashMap
将添加到ListView
,其中包含3 TextView
。
我按如下方式填充ArrayList
,然后将其分配给适配器以显示它:
ArrayList<HashMap<String, String>> list1 = new ArrayList<HashMap<String, String>>();
HashMap<String, String> addList1;
for (int i = 0; i < count; i++) {
addList1 = new HashMap<String, String>();
addList1.put(COLUMN1, symbol[i]);
addList1.put(COLUMN2, current[i]);
addList1.put(COLUMN3, change[i]);
list1.add(addList1);
RecentAdapter adapter1 = new RecentAdapter(CompanyView.this,
CompanyView.this, list1);
listrecent.setAdapter(adapter1);
}
现在在listItemClick
上,所提取的数据在不同时间具有不同的格式。
例如。我的列表包含以下数据:
ABC 123 1
PQR 456 4
XYZ 789 7
即。当我在点击第一个列表项后记录获取的字符串时,我得到了几个输出中的一个:
{1 = ABC,2 = 123,3 = 1}
{First = ABC,Second = 123,Third = 1}
{1 = 123,0 = ABC,2 = 1}
甚至 {27 = 123,28 = 1,26 = ABC}
最初我用过:
int pos1 = item.indexOf("1=");
int pos2 = item.indexOf("2=");
int pos3 = item.indexOf("3=");
String symbol = item.substring(pos1 + 2,pos1 - 2).trim();
String current = item.substring(pos2 + 2, pos3 - 2).trim();
String change = item.substring(pos3 + 2, item.length() - 1).trim();
然后对于第四种情况,我必须使用:
int pos1 = item.indexOf("26=");
int pos2 = item.indexOf("27=");
int pos3 = item.indexOf("28=");
String symbol = item.substring(pos1 + 3, item.length() - 1).trim();
String current = item.substring(pos2 + 3, pos3 - 3).trim();
String change = item.substring(pos3 + 3, pos1 - 3).trim();
这样我就可以在ABC
中获得symbol
,依此类推。
但是,通过这种方法,应用程序完全失去了它的可靠性。
我也试过
while (myVeryOwnIterator.hasNext()) {
key = (String) myVeryOwnIterator.next();
value[ind] = (String) addList1.get(key);
}
但它没有给出适当的价值。相反,它返回例如随机符号。 ABC或PQR或XYZ。
我做错了吗?
提前致谢!
答案 0 :(得分:2)
HashMap的put函数不按特定顺序插入值。因此,最好的方法是将HashMap的键集放在ArrayList中,并使用ArrayList索引检索值
ArrayList<HashMap<String, String>> list1 = new ArrayList<HashMap<String, String>>();
HashMap<String, String> addList1;
ArrayList<String> listKeySet;
for (int i = 0; i < count; i++) {
addList1 = new HashMap<String, String>();
addList1.put(COLUMN1, symbol[i]);
addList1.put(COLUMN2, current[i]);
addList1.put(COLUMN3, change[i]);
listKeySet.add(COLUMN1);
listKeySet.add(COLUMN2);
listKeySet.add(COLUMN3);
list1.add(addList1);
RecentAdapter adapter1 = new RecentAdapter(CompanyView.this,
CompanyView.this, list1);
listrecent.setAdapter(adapter1);
}
检索使用时
addList1.get(listKeySet.get(position));
这里,arraylist listKeySet仅用于保存插入HashMap键的顺序。将数据放入HashMap时,将密钥插入ArrayList。
答案 1 :(得分:1)
我不认为使用HashMap
这个目的是个好主意。我会实现类填充数据的类,如
class myData {
public String Column1;
public String Column2;
public String Column3;
// better idea would be making these fields private and using
// getters/setters, but just for the sake of example these fields
// are left public
public myData(String col1, String col2, String col3){
Column1 = col1;
Column2 = col2;
Column3 = col3;
}
}
并像
一样使用它ArrayList<myData> list1 = new ArrayList<myData>();
for (int i = 0; i < count; i++) {
list1.add(new myData(symbol[i], current[i], change[i]));
}
//no need to create new adapter on each iteration, btw
RecentAdapter adapter1 = new RecentAdapter(CompanyView.this,
CompanyView.this, list1);
listrecent.setAdapter(adapter1);
当然,您需要在适配器中进行更改才能使用myData而不是HashMap<String,String>
。