今天在一个留言APP重写的过程中遇到了一个大坑,留言版的APP如右图,首先登陆跳转到这个界面后是连接服务器获取数据,调用一次notifyDataSetChanged()更新listview。
那么当在输入框填写东东按发送后,需再进行一次更新。
之前用的方法是通过recreate()让整个activity重新载入。
重写的时候用到第二次的notifyDataSetChanged()测试了一天一直没法实现,本来以为问题出在handler,loop部分。下午看了一堆资料后才发现这个大坑。
要使用如下代码进行第二次的notifyDataSetChanged()更新
lists = new ArrayList<Map<String, Object>>();//第一次刷新listview时adapter加载的是lists
list = new ArrayList<Map<String, Object>>();
map.put...
...
map.put...
...
list.add(map);
lists.clear();
lists.addAll(list);
ad.notifyDataSetChanged();
原因在于:对于ArrayList来说,执行一次add方法,并不会将add的元素指向一个堆里边,而是指向不同的堆中,所以当第二次进行更新时,就碰到了坑。此时应该新建一个ArrayList,将需add的元素加入里边,然后清除原来第一个Arraylist的数据,将第二个Arraylist的所有元素加入到第一个中,再进行刷新
Soga
sofa