错误记录 | 一个导致ListView中item内容全部重复的可能原因

warning: 这篇文章距离上次修改已过1022天,其中的内容可能已经有所变动。

最近在写一个快递查询的WearOS App,突然有一次调试发现主界面的ListView里的item,显示的都是一模一样的内容,全是最新添加的一个快递的内容(这是一个伏笔哈哈哈)。
遂思前想后,开始以为是ListView的问题,但是没结果。接着以为是Adapter的问题,但很快又否决了这个想法,因为项目一开始也是用的SimpleAdapter,且当时ListView显示正常。无意中看到一篇Blog:

HashMap对象重复赋值在多线程中的教训
https://blog.csdn.net/goodguyzl/article/details/83847286

该文中写道:

“HashMap对象是在while循环外面声明的(第一行代码那里),但是在循环里面这个HashMap对象反复了put了key相同的两个键值对,问题可能就出在这里”“HashMap对象是在while循环外面声明的(第一行代码那里),但是在循环里面这个HashMap对象反复了put了key相同的两个键值对,问题可能就出在这里”

我猛然意识到我也犯了同样的错误!

info:HashMap对象的申明放到循环外的话,意味着循环内的每次put会覆盖掉原有的值,而且ListView每次add的都是同一个HashMap对象!
这就是为什么我的项目里ListView中显示的item全是最新添加的一个快递的信息。


下面是我的代码和运行界面的前后对比。(ListView显示的item的数据源没有改变的情况下)

//修改前的问题代码
Map<String, Object> showitem = new HashMap<String, Object>();
for (int i = 0; i < len; i++) {
    showitem.put("comIcon", imgIds[i]);
    showitem.put("name", names[i]);
    showitem.put("expNos", expNos[i]);
    showitem.put("expInfos", expInfos[i]);
    listitem.add(showitem);
}
SimpleAdapter myAdapter = new SimpleAdapter(getApplicationContext(), listitem, R.layout.list_item, new String[]{"comIcon", "name", "expNos","expInfos"}, new int[]{R.id.comIcon, R.id.name, R.id.expNum,R.id.expInfo});
listView.setAdapter(myAdapter);

运行结果:

//修改后的正常代码
for (int i = 0; i < len; i++) {
    Map<String, Object> showitem = new HashMap<String, Object>();
    showitem.put("comIcon", imgIds[i]);
    showitem.put("name", names[i]);
    showitem.put("expNos", expNos[i]);
    showitem.put("expInfos", expInfos[i]);
    listitem.add(showitem);
}
SimpleAdapter myAdapter = new SimpleAdapter(getApplicationContext(), listitem, R.layout.list_item, new String[]{"comIcon", "name", "expNos","expInfos"}, new int[]{R.id.comIcon, R.id.name, R.id.expNum,R.id.expInfo});
listView.setAdapter(myAdapter);

修改后的运行结果:


[这是一篇历史文章,来自我的CSDN博客https://blog.csdn.net/weixin_43114076/article/details/114830741]

添加新评论