Как решить эту логическую ошибку hashmap в Android? - PullRequest
0 голосов
/ 01 ноября 2011

Я столкнулся с некоторой известной разрешимой проблемой, но поражен здесь.В моем коде значения сохраняются в ArrayList на первом для выполнения цикла.Однако во 2-м цикле и далее значения перезаписываются окончательными значениями в ArrayList.Наконец, последние введенные значения сохраняются вместе с количеством раз размера списка.

lstall = (ListView)findViewById(R.id.lvall);
sampleArrayList =  new ArrayList<HashMap<String, String>>();
ListAdapter sampleListAdapter;
dh = new DBHelper(this);
HashMap<String, String> sampleObjectMap;
List<String> lvall = dh.selectAll();
sampleObjectMap= new HashMap<String, String>();
for(int i=0;i<lvall.size();i++)
{
    for (@SuppressWarnings("unused") String sampleObj : lvall) 
    {
        sampleObjectMap.put("title", dh.val1(i));
        sampleObjectMap.put("person", dh.pers(i));
        sampleObjectMap.put("priorty", setpriority(String.valueOf(dh.prioirty(i))));
        sampleObjectMap.put("dat", getDate(Long.valueOf(dh.time(i)),"dd/MM/yyyy"));

    }
    sampleArrayList.add(sampleObjectMap);

}

Мне нужно сохранить все значения в массиве и отобразить в виде списка.Любая помощь высоко ценится и заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 01 ноября 2011

Вы создаете один HashMap<String, String> и многократно перезаписываете записи внутри него.

Фактически, вы делаете это дважды , так как у вас есть вложенный цикл for для noочевидная причина.Я полагаю, что вы хотите:

for (int i = 0; i < lvall.size(); i++)
{
    HashMap<String, String> sampleObjectMap = new HashMap<String, String>();
    sampleObjectMap.put("title", dh.val1(i));
    sampleObjectMap.put("person", dh.pers(i));
    sampleObjectMap.put("priorty", setpriority(String.valueOf(dh.prioirty(i))));
    sampleObjectMap.put("dat", getDate(Long.valueOf(dh.time(i)),"dd/MM/yyyy"));
    sampleArrayList.add(sampleObjectMap);
}

Также кажется странным использовать размер списка, но на самом деле не использовать значения в списке ... вы можете подумать о реструктуризации своего кода ...

1 голос
/ 01 ноября 2011

Попробуйте:

for(int i=0;i<lvall.size();i++)
{
        sampleObjectMap= new HashMap<String, String>();
        sampleObjectMap.put("title", dh.val1(i));
        sampleObjectMap.put("person", dh.pers(i));
        sampleObjectMap.put("priorty", setpriority(String.valueOf(dh.prioirty(i))));
        sampleObjectMap.put("dat", getDate(Long.valueOf(dh.time(i)),"dd/MM/yyyy"));

        sampleArrayList.add(sampleObjectMap);

}
1 голос
/ 01 ноября 2011

Все элементы в списке имеют ссылку на один и тот же экземпляр Map, и вы переопределяете одинаковые записи Map для каждой итерации.

for(int i=0;i<lvall.size();i++) {
     // move it inside the loop
     sampleObjectMap= new HashMap<String, String>(); 

Но я не думаю, что вам нужна Map здесь. Просто создайте класс со всеми обязательными полями в качестве переменных-членов.

0 голосов
/ 01 ноября 2011

Я не проверял это, но попробуйте создать новую карту

    sampleObjectMap = new HashMap<String, String>(); 

в вашем внутреннем цикле, прежде чем вы положили. Попробуй это. Позже попробуйте использовать 1 объект карты и вызвать clear () после записи карты в sampleArrayList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...