滚动列表对于几乎每个主要的移动应用而言都是必不可少的,它对最终用户的影响最大。 Android的列表视图性能使人们相信Android是次于iOS的操作系统。
但事实证明,通过少量的优化和一些专用的时间,Android的滚动性能可以与iOS的性能一样好。
您会看到,即使iOS在这个部门确实有帮助,iOS开发人员仍然必须花费大量的时间来优化其滚动列表以使其平滑滚动。 在Android上,只需要一点时间。
在尝试通过多次尝试改善Android的滚动性能时,重要的是要意识到以下几点:
- 创建对象非常昂贵
- 过多地调用findViewById可能很痛苦
- 仅在必要时在屏幕上绘制
您可以进行一些快速优化,以在所花费的时间内获得最大的性能提升。
第一个优化是最常见的优化:View Holder。 它减少了滚动时必须创建的对象数量,并大大减少了一些昂贵的UI调用。 仅此优化一项就可以使性能提高约100%。 可以在这里找到有效模式的一个很好的例子。
另一种较少使用的优化方法是仅在用户实际上没有滚动列表时才绘制视图。 这是一个主意:如果列表视图项目由一些图像,一些文本和一个复选框组成,那么您的用户是否真的需要查看所有这些在滚动时生成的视图?
当用户滚动时,所有用于计算详细视图的工作都将浪费掉,并且杀死了滚动动画。
用户也不需要具有滚动数据的详细视图,只需确定用户当前在列表中的位置即可。 例如,在按字母顺序排序的列表中,您可以通过检查列表中的文本来知道自己的位置。
因此,为什么不滚动时绘制所有这些无用的视图,为什么不只在视图上绘制文本? 通过仅绘制最重要的视图,您的列表视图应看到滚动速度的巨大提升,使其看起来更加平滑。
为了使以下代码正常工作,您需要向适配器添加一个布尔值(isScrolling)。 每当scrollState不为零(或滚动)时,请将此值设置为true。 滚动停止后,您可以告诉适配器重新绘制具有必要细节的视图。
listView.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCoun) {
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState != 0)
listView.getAdapter()).isScrolling = true;
else {
listView.getAdapter()).isScrolling = false;
listView.getAdapter()).notifyDataSetChanged();
}
}
});
将以上代码添加到listView.getView()方法之后,可以使用新添加的布尔值来确定是否需要绘制任何性能密集型视图,例如图像或复杂按钮。
上面的两个优化将使您在最少的投资时间内获得良好的性能提升。
您是否知道其他一些用于Android的List View性能的隐藏式优化工具?
参考: Programming Mobile博客上来自我们的JCG合作伙伴 Isaac Taylor的Android中的Buttery Smooth List Scrolling 。
翻译自: https://www.javacodegeeks.com/2012/06/android-smooth-list-scrolling.html