warning: 这篇文章距离上次修改已过608天,其中的内容可能已经有所变动。
最近在写一个快递查询的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);
运行结果:
代码语言:javascript复制//修改后的正常代码
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]