android ListView简单适配器,重复项

时间:2013-07-18 04:31:28

标签: android arrays android-listview hashmap simpleadapter

我创建了一个自定义ListView,并在java中填充了ListView SimpleAdapter。这是我的代码:

setContentView(R.layout.activity_my);
list = (ListView) findViewById(R.id.lvList);

itemList = new ArrayList<HashMap<String, String>>();
itemMap = new HashMap<String, String>();

for (int i = 0; i < songs.length; i++) {
    itemMap.put("song", songs[i]);
    itemMap.put("artist", artists[i]);
    System.out.println(songs[i] + "     " + artists[i]);
    itemList.add(itemMap);
}

SimpleAdapter adapter = new SimpleAdapter(this, itemList,
            android.R.layout.simple_list_item_2, new String[] {"song",
                    "artist"}, new int[] { android.R.id.text1,
                    android.R.id.text2 });
list.setAdapter(adapter);

现在我分别创建了两个String Arrays歌曲和艺术家,并将它们放在HashMap中,然后将HashMap放入名为ArrayList的{​​{1}}中。之后,我使用参数中的默认列表项id设置适配器。

我面临的问题是,当我运行应用程序时,列表视图只重复显示字符串数组的最后一项和子项。这是图片供参考。 My ListView

我想知道为什么会这样。我尝试将itemList放在itemList.add(itemMap);循环之外,但它仍然不起作用。如果有正确的解释,帮助真的会受到赞赏,因为我对此有点新鲜。谢谢!

2 个答案:

答案 0 :(得分:3)

您可以通过在每次迭代时重新创建itemMap对象来实现此目的。请尝试以下方式。

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

for (int i = 0; i < songs.length; i++) {
    itemMap.put("song", songs[i]);
    itemMap.put("artist", artists[i]);
    System.out.println(songs[i] + "     " + artists[i]);
    itemList.add(itemMap);
}

将此更改为

for (int i = 0; i < songs.length; i++) {
    itemMap = new HashMap<String, String>();
    itemMap.put("song", songs[i]);
    itemMap.put("artist", artists[i]);
    System.out.println(songs[i] + "     " + artists[i]);
    itemList.add(itemMap);
}

阐释:

Refer在这里。注意HashMapkey value对,这意味着它将为密钥存储一些值。因此HashMap不允许重复密钥。您已经在代码中添加了songartist的值。因此,您无法再次为这些键添加值。但itemlist在每次迭代时添加itemMap。这就是列表重复相同记录的原因。要避免此问题,只需重新实例化itemMap对象。

我希望这会对你有所帮助。

答案 1 :(得分:0)

兄弟,你不会相信,但你做错了。

在每次迭代时创建一个HashMap的新对象。