ListViewis one of Android's most widely used widgets. It is rather easy to
use, very flexible and incredibly powerful.ListView
can also be difficult to understand at times.
One of the most common issues withListView
happens when you try to use a custom background. By default, like many Android
widgets,ListView
has a transparent background which means yo can see through the default window's background, a very dark
gray (#FF191919
with the current dark theme.) Additionally,ListView
enables
thefading edgesby default, as you can see at the top of the following screenshot; the first text item gradually fades to black. This technique is used throughout the system to indicate that the container can be scrolled.
The fade effect is implemented using a combination ofCanvas.saveLayerAlpha()
and thePorter-Duff Destination Out blending mode.
This technique is similar to the one explained inFilthy Rich Clientsand various presentations. Unfortunately, things
start to get ugly when you try to use a custom background on theListView
or when you change the window's background. The
following two screenshots show what happens in an application when you change the window's background. The left image shows what the list looks like by default and the right image shows what the list looks like during a scroll initiated with a touch gesture:
This rendering issue is caused by an optimization of the Android framework enabled by default on all instances ofListView
(for
some reason, I forgot to enable it by default onGridView
.) I mentioned earlier that the fade effect is implemented using
a Porter-Duff blending mode. This implementation works really well but is unfortunately very costly and can bring down drawing performance by quite a bit as it requires to capture a portion of the rendering in an offscreen bitmap and then requires extra blending
(which implies readbacks from memory.)
SinceListView
is most of the time displayed on a solid background, there is no reason to go down that expensive route.
That's why we introduced an optimization called the "cache color hint." The cache color hint is an RGB color set by default to the window's background color, that is #191919 in Android's dark theme. When this hint is set,ListView
(actually,
its base classView
) knows it will draw on a solid background and therefore replaces th expensivesaveLayerAlpha()/Porter-Duff
rendering
with a simple gradient. This gradient goes from fully transparent to the cache color hint value and this is exactly what you see on the image above, with the dark gradient at the bottom of the list. However, this still does not explain why the entire list
turns black during a scroll.
As I said before,ListView
has a transparent/translucent background by default, and so all default Android widgets. This
implies that whenListView
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 aBitmap
filled with the hint value (this assumes
that another optimization, calledscrolling 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. And 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. This can be domefrom
codeor preferably from XML, by using theandroid:cacheColorHint
attribute. To disable the optimization, simply
use the transparent color#00000000
. The following screenshot shows a list withandroid:cacheColorHint="#00000000"
set
in the XML layout file:
As you can see, the fade works perfectly against the custom wooden background. I find the cache color hint feature interesting because it shows how optimizations can make developers' life more difficult in some situations. In this particular case, however, the benefit of the default behavior outweighs the added complexity for the developer.
相关推荐
Android ListView 滑动分页 分页加载数据
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
解决复杂布局,scrollview嵌套ListView滑动性能的问题,提供下拉刷新和暴露对外操作listview控件UI的方法,同步博文:http://blog.csdn.net/qq_28690547/article/details/50792439
ListView每页加载10条数据,当滑动到页尾时自动加载下面的数据。
android listview滑动到底部加载更多数据
实现ListView选项左右滑动,可以再该demo基础上实现自己想要的效果,如滑动删除等
android listview滑动删除
滑动listview标题置顶,listview吸顶效果,安卓系统状态栏透明,有图有源码
Android实现ListView滑动删除实现了Android中的ListView滑动删除功能,亲测可用哦
Android ListView错位问题之背景色错位
Android ListView滑动删除
Android ListView滑动删除item借助ViewDragHelper,实现ListView的item滑动删除
主要是实现了listview滑动删除,以及对view的滑动测试
* Android下拉刷新自动加载更多 * @author mzba * */ public class PullToRefreshActivity extends ListActivity { private LinkedList, String>> mListItems; private NewsAdapter adapter; private int ...
android listview快速滑动,修改默认的滑动条Demo.zip
android Listview下拉刷新 上拉(滑动分页)加载更多 高仿新浪微博下拉刷新,同时实现了滑动加载下一页
ScrollView嵌套ListView滑动冲突的解决方案
源码参考,欢迎下载
http://blog.csdn.net/icqapp/article/details/24978057 详看效果图...android listview左右滑动分页(viewpager嵌套listview进行分页),焦点图带圆焦点 先敬告学者:如在此项目上运行不了的直接找到本人QQ:508181017,
android listview item 左右滑动删除