出现列表点击显示错乱的现象,一定是适配器的问题,并且一定是getView方法里面的问题,在getView中,如果有if语句,一定一定一定要有对应的else语句,否则很容易出现错乱,因为这从逻辑上就不对!除此之外,请检查一下你是否有一个Map集合来存储复选框的check状态;如果没有,请加一个!
最近维护的录音模块需要给列表的每一个item的复选框添加动效,由原来的点击item图片切换变为动画切换,什么时候需要A动画不需要B动画,什么时候需要B动画不需要A动画,什么时候都需要,什么时候都不需要,这样一下子就增加了很多种情况,于是新引入了两个布尔值来进行控制刷新、显示和启动关闭动画,由于缺乏经验,走了很多坑,现在回过头来,自己总结一下吧!
首先,这些控制着刷新、显示和启动关闭动画的布尔值一定要见名知意,否则一段时间之后你自己都会搞不清楚这些变量是什么意思,和何况后来接手你项目的维护人员,就比如我接手录音模块时,适配器中有两个布尔变量分别叫做isEdit和canEdit,搞了半天都搞不清楚他们之间的区别,虽然没搞懂,但是不影响功能的添加和动画的实现,于是就稀里糊涂的用下去了,直到后来情况变的与越来越复杂,加一个布尔变量复杂度就会变成原来的两倍,一旦出现bug,改起来真的是头痛,直到昨天,我痛下决心大改了一次,去掉原有的看不懂的变量,详细的罗列出所有的显示情况,废话很多,先上例子!
例子:
需求:
1.列表界面,分为两个状态,编辑状态和非编辑状态,编辑状态下复选框显示为可见,非编辑状态下复选框显示为不可见;
2.编辑状态下,点击item,所在的position的item中的复选框显示点击动画,其他item的复选框不显示点击动画;
3.编辑状态与非编辑状态切换时,所有item的复选框执行滑入或者滑出的动画;
4.非编辑状态下,点击item,在复选框的位置出现音乐波形图,复选框不显示;
5.编辑状态下无法左滑删除,非编辑状态下可左滑删除;
基于上述需求,设置如下变量:
private boolean isInEditState = false;//是否处于编辑状态private boolean closeAllLeftMenu = false;//是否关闭所有的左滑删除menuprivate boolean ispause = true;//是否处于暂停状态private boolean isNeedSlideAnimFromRightToLeft = false;//是否需要复选框滑入动画private boolean isNeedSlideAnimFromLeftToRight = false;//是否需要复选框滑出动画
设置一个Map集合来存储复选框的check状态;
private Map<Integer, Boolean> isSelectedList = new HashMap<>();并且在Adapter初始化的时候对集合赋值
public ListAdapter(Context context, List datas, int layoutId) { super(context, datas, layoutId); this.layoutId = layoutId; this.context = context; this.list = datas; initData(); } private void initData() { if (list != null && list.size() > 0) { for (int i = 0; i < list.size(); i++) { isSelectedList.put(i, false); } } }
键值对分别是:Key:Position,值:Value:CheckState
在每一次点击时改变所点击的position的value值,其他的不变,在Adapter中getView方法中,将除了当前点击的item之外的所有item的复选框check状态刷新为与集合中的check状态一致,且刷新时不执行动画;
最近加班比较多,想写又不想写博客,算了,先写这么多,以后再完善吧!