问题描述
今天写了个代码,ListView下面增加展开、收缩的按钮。我的思路是为list准备一个副本list2,原来的list用于展示,副本用于恢复数据,思路其实没有错,但是调用notifyDataSetChanged()并没有起到展开、收起的效果。
原因分析
适配器原来是其他人写的,适配器里面已经有new ArrayList的代码了,但是我在Activity里面又new出了一个ArrayList,这和适配器采用的集合不一致,所以调用notifyDataSetChanged()起不到刷新界面的作用。
错误示范如下:
//其他人原来就写好的适配器
public class OtherPeopleAdapter exends BaseAdapter{
private List<Object> list=new ArrayList();//适配器里面已经new出一个ArrayList了
public OtherPeopleAdapter(List<Object> list){//构造器
this.list.addAll(list);
}
}
public class MainActivity{
private List<Object> list=new ArrayList();//然而你在活动里又new出一个ArrayList
}
你在活动里又new出一个ArrayList,你希望改变活动里面的ArrayList的元素内容,再调用Adapter的notifyDataSetChanged()方法刷新页面,结果肯定刷新不了的,因为适配器已经早有属于自己的ArrayList了。
正确示范如下:
//其他人原来就写好的适配器
public class OtherPeopleAdapter exends BaseAdapter{
private List<Object> list;//不要在这里new ArrayList
public OtherPeopleAdapter(List<Object> list){//构造器
this.list=list;
}
}
总而言之,要保证Adapter使用的是同一个ArrayList,不能在这边new一个,那边又new一个,Adapter不会脚踏两条船,别人变成什么样,不关它的事,也就肯定不会刷新页面。