问题
有一个简单的ExpandableListView用于显示某一天下面的事件列表。为了符合整体的风格,把窗口的背景设成了白色,把ExpandableListView的背景也设置成了白色!一切都很好,但突然发现,当滑动的时候,ExpandableListView会变黑!甚是奇怪。刚开始以为是Focus的问题,调整了不管用。后来,调整了每个GroupItem和ChildItem的背景,把它们的背景都设成白色的,问题是解决了,但想不明白原因是什么。Google了一下才发现原来这是Android里的一个坑,并且有更好的解法。下图中右边是正常情况下的截屏,左边是滑动时的情况.
首先是StackOverflow里面有一个帖子讲的关于这个,不过不是ExpandableListView而是ListView,但ExpandableListView是继承自ListView并且在事件手势处理方面并没有做其他动作。里面提到了这篇文章,讲的很透切,把问题的原因说清了,大意是酱紫的:
ListView(其实查看了源码,很多东西都是AbsListView,因为ListView的滑动,手势,事件等都是由AbsListView来做的)本身的背景是透明的,你看到的ListView之所以是黑色的(Android 2.3默认情况下)其实并不是ListView或者其Item的背景,而是窗体的背景,ListView是透明的。因为背景是透明的,所以在渲染时,就必须做混合,把子Item的前台着色和背景与窗体背景进行混合(blending).这样做效果很好,但是效率稍差,所以当滑动时,ListView中的Item都是一闪而过,很快会滑过一大把的Item,所以如果对每个显示出来的Item都做这样的混合的话,性能会有损失.所以为了优化就使用了cache
color hint这个东西,它仅是一个RGB着色值,ListView会把它当作滑动时的背景,因为它并不是透明的,所以在滑动的时候就不会做Blending,进而提升的效率.因为默认情况下窗体的背景是#191919,而AbsListView默认的cache color hint也是#191919,所以你看不出来!
而当你设置了窗体背景和ListView的背景时就不一样了,窗体背景着色变了,而默认的cache color hint还是#191919所以,你滑动的时候就会看到ListView是黑色的.
因为ExpandableListView是ListView的子类,所以它也有这个问题.
原文 前半段说到了在边缘时的渐裉色也用到了cache color hint但与这个问题无关.
解法
最简单的解法,就是把ListView的每个Item的背景色也都调成跟窗体背景色一致.这样Item会盖住ListView的cache color hint自然会解决问题.但如果窗体的背景是一个整体的图片的话这样做就会不妥,实现起来也有难度.
其次的解法就是作者建议的把cache color hint设置成透明色#00000000,这样实际上会Disable掉ListView滑动时的优化,因为你把它变成了无色透明的,它必须去做Blending.自然这会造成损失,不过对于现在的Android系统,这并不算是问题(原文是在2009年1月发布的,那个时候的Android性能还很差,各方面也都很差).这非常适用于窗体的背景一个图片时.
如果你的窗体背景是一个着值的话,更好的解法是把ListView的cache color hint设置成与背景色一致的着色,这样滑动的优化仍然有效果.
分享到:
相关推荐
本demo实现功能为:Expandablelistview子项checkBox先获取已选择状态,在次过程中可修改子项选择,最终提交选择子类的项,并打印相关数据
ExpandableListView中group和child自定义视图带CheckBox,实现child全选、部分选中功能,同时实现类似邮件群发的用户选择功能,选中的用户在EditText中显示,点击后移除. 更新: 1. ExpandableListView勾选后生成的...
#Android ExpandableListView Android ExpandableListView 实现示例。 该项目是用 Android Studio 0.8.14 编译的
CommentWithReplyView-master 基于ExpandableListView实现评论和回复的功能。 > 说明 ...处理了NestedScrollView、ExpandableListView和CoordinatorLayout的嵌套问题 点击某条评论,即可@ta进行回复
android ExpandableListView简单例子
Android的ExpandableListView,可以用来实现一级二级级联菜单,这是一个demo
Android之ExpandableListView控件的使用
基于Android中的ExpandableListView开发示例, 应用list集合类型
android中ExpandableListView嵌套GridView的使用
android ExpandableListView 四级树形目录 可无限延伸。
Android 下拉刷新ExpandableListView。做了几个分组好友列表。是一些数组数据加进去测试的。可以一看。
Android实现自定义适配器的ExpandableListView示例,准备一级列表中显示的数据:2个一级列表,分别显示"group1"和"group2",准备第一个一级列表中的二级列表数据:两个二级列表,分别显示"childData1"和"childData2",...
android ExpandableListView三级菜单的使用,多级菜单下拉与隐藏,ExpandableListView的简单使用
点击ExpandableListView头部时,子集动态加载。已有子集不重新加载。 ExpandableListView滚动时,头部孤独。 IphoneTreeView功能
利用ViewPager实现菜单栏和内容栏的左右滑动,同时菜单栏采用ExpandableListView实现二级菜单,点击菜单项,在右边的内容栏显示对应的数据。
Android ListView和ExpandableListView的侧滑删除操作 实现了ListView和ExpandableListView的左滑出现删除的功能。能在实体机和虚拟机上运行,无广告,实现效果和截图一样,但点击expand按钮,在地点进行侧滑时会...
NULL 博文链接:https://geyubin.iteye.com/blog/1187831
前几篇文章介绍了Listview,但在实际开发中也经常会用到多层的Listview来展示数据,比如qq中的好友展示,所以这张来了解一下ExpandableListview,基本思想与Listview大致是相同的,所以用起来会比较方便。
ExpandablelistView+swipeLayout实现的滑动删除效果,附带实现了时间轴 github地址:https://github.com/vienan/TimeLine
Android项目实战--手机卫士33--ExpandableListView的使用