无法正确从Hashmap获取数据

时间:2012-01-19 12:00:10

标签: android listview hashmap android-listview

我有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。

我做错了吗?

提前致谢!

2 个答案:

答案 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>