Невозможно получить данные из Hashmap правильно - PullRequest
0 голосов
/ 19 января 2012

У меня есть 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-го элемента списка, я получаю один из нескольких выходных данных:

{1 = ABC,2 = 123, 3 = 1}

{Первый = ABC, Второй = 123, Третий = 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();

Тогда для 4-го случая я должен использовать:

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 ]

2 голосов
/ 19 января 2012

Функция put в HashMap не вставляет значение в определенном порядке.Таким образом, лучший способ - поместить набор ключей 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));

.listKeySet просто используется для сохранения порядка вставки ключей HashMap.Когда вы помещаете данные в HashMap, вставьте ключ в ArrayList.

1 голос
/ 19 января 2012

Я не думаю, что использование HashMap для этой цели - хорошая идея. Я бы реализовал Class, инкапсулирующий ваши данные как

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>, конечно.

...