Android ListView那些事

  次阅读 来源:互联网(转载协议) 2015-12-04 16:23 我要评论(0)

ListView是我们在开发Android程序时用得比较多的一种widget,通常用来展示多条数据,这里,我对ListView的一些功能点作一个简单介绍。

1. Cache color hint

默认情况下,Android中的View的背景都是透明的,这是一个合理的设计,但是,当渲染到屏幕上时,这会引入许多的计算,因为所有的child的背景是透明的,这就意味着当ListView绘制它的child时,会导致child与window的背景色相混合,当ListView上下滑动或Fling时,性能就会下降。当ListView上下滑动或者是Fling时,为了避免这种情况发生或提高渲染速度,ListView引入了"scrolling cache"机制。这个机制简单地说来就是ListView把可见的child绘制在一个bitmap上面(系统将每一个child拷贝到由cache

color hint填充的bitmap上面),然后再直接把这个bitmap绘制到屏幕上,由于这个bitmap是不透明的,所以就不会有混合计算,这样就提高了绘制的效率。

但是,由于系统默认的cache color hint的颜色是#191919,当你滑动ListView时,你就会看到一个黑色的背景。

出现这种情况肯定是不正确的,那么怎么解决呢?

最简单的方法是将cache color hint设置为透明。

android:cacheColorHint="#00000000" 或 setCacheColorHint(Color.TRANSPARENT)

以下是官方文档的原文:

As mentioned before, ListView has a transparent/translucent background by default, and so all default widgets in the Android UI toolkit. This implies that when ListView redraws its children, it has to blend the children with the window's background. Once again,

this requires costly readbacks from memory that are particularly painful during a scroll or a fling when drawing happens dozen of times per second.

To improve drawing performance during scrolling operations, the Android framework reuses the cache color hint. When this hint is set, the framework copies each child of the list in a Bitmap filled with the hint value (assuming that another optimization, called

scrolling cache, is not turned off). ListView then blits these bitmaps directly on screen and because these bitmaps are known to be opaque, no blending is required. Also, since the default cache color hint is #191919, you get a dark background behind each

item during a scroll.

To fix this issue, all you have to do is either disable the cache color hint optimization, if you use a non-solid color background, or set the hint to the appropriate solid color value. You can do this from code (see setCacheColorHint(int)) or preferably from

XML, by using the android:cacheColorHint attribute. To disable the optimization, simply use the transparent color #00000000. The following screenshot shows a list with android:cacheColorHint="#00000000" set in the XML layout file.

2. Divider

通过android:divider XML属性来指定。

Divider可以颜色或者Drawable,当绘制内容时,ListView会自动地计算出divider的位置。由于divider接收一个drawable,它可以是ColorDrawable,也可以是BitmapDrawable,但是,由于ColorDrawable,它是没有高度的,所以Drawable#getIntrinsicHeight()方法返回-1,因此,为了避免这个问题, 我们可以通过android:dividerHeight属性来设计其高度。

3. ListView绘制顺序

对于ListView的绘制顺序,我们很有必要了解一下。先看一下下面的图片。

\

从上面的图片可以看出,Android首先绘制背景和Dividers,然后再绘制其selector,最后,绘制所有的item在最上面。

由于通过情况下,listview的item的背景是透明的,所以,当用户按下一个item时,黄色的selectZ

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...