Android:平滑列表滚动

本文探讨了如何提高Android滚动列表的性能,使其与iOS相当。通过理解对象创建的昂贵成本、避免频繁调用findViewById、以及智能地控制视图绘制,可以显著提升滚动体验。文中介绍了ViewHolder优化和滚动时减少视图绘制的方法,这两种策略可以在短时间内带来明显的性能提升。
摘要由CSDN通过智能技术生成
如果我必须将iOS与Android进行比较,并且仅列出iOS相对于Android的一项主要优势,那就是滚动列表的性能,出色的表现( 而且我不是唯一的一个两个三个这样的人……)。

滚动列表对于几乎每个主要的移动应用而言都是必不可少的,它对最终用户的影响最大。 Android的列表视图性能使人们相信Android是次于iOS的操作系统。

但事实证明,通过少量的优化和一些专用的时间,Android的滚动性能可以与iOS的性能一样好。

您会看到,即使iOS在这个部门确实有帮助,iOS开发人员仍然必须花费大量的时间来优化其滚动列表以使其平滑滚动。 在Android上,只需要一点时间。

在尝试通过多次尝试改善Android的滚动性能时,重要的是要意识到以下几点:

  1. 创建对象非常昂贵
  2. 过多地调用findViewById可能很痛苦
  3. 仅在必要时在屏幕上绘制

您可以进行一些快速优化,以在所花费的时间内获得最大的性能提升。

第一个优化是最常见的优化: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值