2

我创建了一个自定义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分别创建了两个 Song 和 Artist 并将它们放入 a 中HashMap,然后放入HashMapaArrayListitemList。之后,我使用参数中的默认列表项 id 设置适配器。

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

我想知道为什么会这样。我试着把循环放在itemList.add(itemMap);外面,for()但它仍然没有用。如果有适当的解释,我们将不胜感激,因为我对此有点陌生。谢谢你!

4

2 回答 2

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

解释:

参考这里。NoteHashMap是一key value对,这意味着它将为键存储一些值。所以HashMap不会允许重复键。从您的代码中,您已经添加了songand的值artist。因此,您不能再次为这些键添加值。但是在每次迭代时itemlist添加。itemMap这就是列表重复相同记录的原因。为了避免这个问题,只需重新实例化itemMap对象。

我希望这能帮到您。

于 2013-07-18T04:39:34.847 回答
0

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

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

于 2014-04-24T12:10:27.053 回答