如何在android中解决这个hashmap逻辑错误?

时间:2011-11-01 09:21:48

标签: java android arraylist hashmap

我正面临着一些已知的可解决问题,但在这里被击中。在我的代码中,值在第一个for循环执行时存储在ArrayList中。但是,在第二个循环中,值会被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);

}

我需要将所有值存储在一个arraylist中并显示在列表视图中。任何帮助都非常感谢,并提前感谢。

4 个答案:

答案 0 :(得分:3)

您正在创建一个HashMap<String, String>并反复覆盖其中的条目。

事实上,你正在做那个两次因为你有一个嵌套的for循环没有明显的原因。我相信你想要:

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 :(得分:1)

尝试一下:

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);

}

答案 2 :(得分:1)

列表中的所有元素都具有相同Map实例的引用,并且每次迭代都会覆盖相同的Map条目。

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

但我认为你不需要Map。只需创建一个包含所有必填字段作为成员变量的类。

答案 3 :(得分:0)

我没有测试过,但尝试创建新地图

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

在你的内循环中,在你做之前。测试一下。稍后尝试使用1个地图对象,并在mapArrayList中记录地图后调用clear()。