问题描述
在安卓开发的过程中,ListView算是比较常见的了,比如qq的最近联系人,好友列表等。但是开发的过程中,要想彻底玩转listview还是需要点耐心的。以下便是我在做一个文件管理系统时使用listview遇到的一些小问题,介于我比较菜,只是想记录下成长的历程而已。
1.切换数据源后listview不更新数据
这个问题是大多数开发者在刚接触listview时都会遇到,一般都会百度一下
“安卓listview怎么更新数据”
“安卓listview适配器怎么做”
“安卓listview更新数据后不显示”
…
之类的问题在百度上一检索,内容非常之多,也就代表安卓的Listview在使用频率上来说比重还是非常大的。
那么针对切换数据源不更新数据的问题,我觉得该从以下角度去探讨。
1.1 数据源的存储地址
要完成listview的数据绑定,肯定需要有数据源。数据源在初始化时,就指定了内存地址。即在绑定的过程中其实是将view的数据源指向了数据源所在内存地址。
itemAdapter.notifyDataSetChanged();
如果在调用了notifyDataSetChanged()方法还无法更新数据,不妨打印一下绑定的数据。如果绑定的数据不为空,那么就很有可能是因为内存地址变换了从而无法将数据显示到listview组件。
造成数据源存储地址改变的方式有很多,例如
初始化
ArrayList<Object> arrayList = new ArrayList<>();
使用的过程中容易出现问题
List<ProjectManageItem> projectManageItemList_ = new SearchFilesUtils().searchFilesForProjectManage(path, "dwg", false);
projectManageItemList=projectManageItemList_;
看着上述的代码没啥问题吧,新建了一个list数据并初始化,完成后将数据赋值给数据源的list。如果这样想,那么恭喜你,和我踩坑的时候一样。原因是新建的list变量也有属于自己的内存地址,而赋值操作则会将数据源的内存地址重新指向新的内存地址,这就导致了数据源内存地址变换,从而数据无法渲染到目标组件。
针对上述问题解决方案如下:
List<ProjectManageItem> projectManageItemList_ = new SearchFilesUtils().searchFilesForProjectManage(path, "dwg", false);
projectManageItemList.addAll(projectManageItemList_);
不要采用赋值操作,而是使用addAll()将新的数据源添加到目标数据源的变量里,这也就保证了目标数据源内存地址不变,从而达到想要的效果。
1.2 数据源类型不对
如果目标数据源的类信息和你添加进来数据源类型不对也会出现问题的。这种问题的解决办法我也不知道,只能自己去避免。当然许多人肯定会说,数据源的类型不一样怎么可能调用addall()方法成功,按道理来说的确是这样,但是别忘记了还有Object类型,万事万物皆对象哟。
这个问题就是我瞎扯的,开发过程中没有谁会遇到。
2.更新数据的方式
2.1动态增加
在原来的基础上添加单条数据,使用add方法,然后notify一下。
projectManageItemList.add(projectManageItem);
itemAdapter.notifyDataSetChanged();
在原有的基础上增加多条数据,可以是集合,使用addall方法
projectManageItemList.addAll(projectManageItemList1);
itemAdapter.notifyDataSetChanged();
2.2 动态删除
在原来的基础上移除某一行,使用remove()方法
projectManageItemList.remove(position);
temAdapter.notifyDataSetChanged();
在原来的基础上移除某一个集合内的所有item
projectManageItemList.removeAll(projectManageItemList1);
itemAdapter.notifyDataSetChanged();
2.3 动态更改
动态更改某一行的数据,先使用get()获得更改对象,然后调用该对象的赋值方法从而修改变量的值。当然修改完成后还是得notify一下。
projectManageItemList.get(position).setProjectManageItem("更改的文件名",true,"");
itemAdapter.notifyDataSetChanged();
动态全部更改数据的我就不介绍了,一般都是直接全删除然后重新添加数据来得比较愉快。
3.切换数据
projectManageItemList.clear();
projectManageItemList.addAll(projectManageItemList1);
itemAdapter.notifyDataSetChanged();
先clear清空list,然后再添加新的数据进去,再就是notify了。
切记不要动态赋值!!!