Android-优化UI性能(2)-提高Adapter的效率

Android-优化UI性能(2)-提高Adapter的效率

一 提高Adapter的效率

Adapter是数据和ListView之间的桥梁,每当需要显示Item时,都会调用getView()

倘若我们的数据量很大,而Adapter的效率很低(每次都会调用inflate创建新的View,inflate(是一个IO操作)),这样界面就会很卡

例如在数据量比较大的时候使用下面的代码来getView()效率会很低:

public View getView(int p_position, View p_contentView, ViewGroup p_parent)
{
        view _item = minflate.inflate(R.layout.list_item_icon_text, null);
    ((TextView)_item.findViewById(R.id.text)).setText(DATA[p_position]);
    ((ImageView)_item.findViewById(R.id.icon)).setImageBitmap((p_position & 1) == 1?micon1:micon2);
    return _item;
}

1,重用已经生成的Item View

使用下面的代码效果会得到较好的提升

public View getView(int p_position, View p_contentView, ViewGroup p_parent)
    {
        //避免每一次都加载View,只在第一次建立View
        if (p_contentView == null)
        {
            p_contentView = minflate.inflate(R.layout.list_item_icon_text, null);

        }
        //已经加载了View,就直接得到数据即可
        else if (p_contentView != null)
        {
            view _item = minflate.inflate(R.layout.list_item_icon_text, null);
            ((TextView)_item.findViewById(R.id.text)).setText(DATA[p_position]);
            ((ImageView)_item.findViewById(R.id.icon)).setImageBitmap((p_position & 1) == 1?micon1:micon2);
            return _item;
        }

        return _item;
    }

2,添加ViewHolder

避免重复查找需要修改的控件,因为使用findViewById是一个很耗时的操作(需要遍历节点),我们可以使用ViewHolder进行缓冲,

这对于item的数据量很大或者item的布局很复杂的情况很有效

示例代码如下:

public View getView(int p_position, View p_contentView, ViewGroup p_parent)
    {
        ViewHolder _viewHolder;
        //第一次建立View,传出一个holder一共后面加载
        if (null == p_contentView)
        {
            //加载组件视图
            p_contentView = minflate.inflate(R.layout.list_item_icon_text, null);
            _viewHolder = new ViewHolder();
            //加载组件
            _viewHolder.mText = ((TextView)p_contentView.findViewById(R.id.text));
            _viewHolder.mIcon = ((ImageView)p_contentView.findViewById(R.id.icon));
            //设置tag
            p_contentView.setTag(_viewHolder);
        }
        else
        {
            //获取tag
            _viewHolder = (ViewHolder)p_contentView.getTag();
        }
        //设置数据值
        _viewHolder.mText.setText(Data[p_position]);
        _viewHolder.mIcon.setImageBitmap((p_position & 1) == 1 ? micon1:micon2);

        //返回
        return p_contentView;
    }
    //缓冲类定义为static
    public static class ViewHolder
    {
        TextView mText;
        ImageView mIcon;
    } 

3,缓存Item的数据

若缓冲Item中的数据需要很长的时间,可以在ViewHolder中缓存

示例代码如下:

public View getView(int p_position, View p_contentView, ViewGroup p_parent)
    {
        ViewHolder _viewHolder;
        //第一次建立View,传出一个holder一共后面加载
        if (null == p_contentView)
        {
            //加载组件视图
            p_contentView = minflate.inflate(R.layout.list_item_icon_text, null);
            _viewHolder = new ViewHolder();
            //加载组件
            _viewHolder.mText = ((TextView)p_contentView.findViewById(R.id.text));
            _viewHolder.mIcon = ((ImageView)p_contentView.findViewById(R.id.icon));
            //设置tag
            _viewHolder.mData = Data[p_position];
            _viewHolder.mBitmap = (p_position & 1) == 1 ? micon1:micon2 ;
            p_contentView.setTag(_viewHolder);
        }
        else
        {
            //获取tag
            _viewHolder = (ViewHolder)p_contentView.getTag();
        }
        //设置数据值
        _viewHolder.mText.setText(Data_viewHolder.mData);
        _viewHolder.mIcon.setImageBitmap(_viewHolder.mBitmap);

        //返回
        return p_contentView;
    }
    //缓冲类定义为了四个属性,你需要缓冲多少个就定义多少个
    public static class ViewHolder
    {
        TextView mText;
        ImageView mIcon;
        Data mData;
        Bitmap mBitmap;
    } 

4,分段显示

当加载很多数据的时候可以考虑分段显示。

版权声明:欢迎交流指正文章的错误,必定虚心接,QQ872785786

时间: 2024-10-06 23:39:14

Android-优化UI性能(2)-提高Adapter的效率的相关文章

合理优化数据库表结构提高项目执行效率[数据库设计]

数据库表设计优化: 有时为了提高数据库效率,可适当考虑反三范式,适当添加冗余字段,减少多表去关联查询. 使用索引: 2.1 数据库表设计时要合理的去使用普通索引.主键索引.唯一索引.全文索引以及复合(组合)索引. 2.2 何时创建索引: (1) 较频繁的作为查询条件的字段; (2) 唯一性太差的字段(如性别/状态字段等),即使我们频繁作为查询的条件,匀不适合创建索引; (3) 数据更新非常频繁的字段(如统计平台当前的在线人数字段/商品的销售数量字段等)是不适合创建索引. 2.3 具体索引的使用请

Android优化——UI优化(三)

使用ViewStub延迟加载 1.ViewStub延迟加载 ViewStub是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,在需要的时候再加载View,可Java中常见的性能优化方法延迟加载一样. 当调用ViewStub的setVisibility函数设置为可见或则调用inflate初始化该View的时候,ViewStub引用的资源开始初始 化,然后引用的资源替代ViewStub自己的位置填充在ViewStub的位置.因此在没有调用setVisibility(int)或则

Android优化——UI优化(一)优化布局层次

优化布局层次 1.避免布局镶嵌过深(如下) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&quo

Android优化——UI优化(一)

优化布局层次 1.避免布局镶嵌过深(如下) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&quo

Android优化——UI优化(四)

使用style替换背景,防止Activity黑色背景闪过 1.原来的布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/img_

Android优化——UI优化(四) 使用stytle

使用style替换背景,防止Activity黑色背景闪过 1.原来的布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/img_

Android优化——UI优化(二)

使用include标签复用布局 - 1.include标签的作用 假如说我下图的这个布局在很多界面都用到了,我该怎么办?每个页面都写一遍的话,代码太冗余,并且维护难度加大. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width=&quo

Android提高UI性能技巧

提高UI性能的方法事实上有非常多在实际的开发中都已经用到了,在此做一下总结. 1.降低主线程的堵塞时间 若一个操作的耗时较长(超过5秒),我们应该将其放入后台线程中运行.仅仅在须要改动UI界面时通知主线程进行改动. Android已经提供了AsyncTask以实现从主线程生成新的异步任务的方法. 2.提高Adapter&AdapterView的效率 (1)重用已生成过的Item View (2)加入ViewHolder , 避免反复查找须要改动的控件 public View getView(in

Android UI性能优化详解

设计师,开发人员,需求研究和测试都会影响到一个app最后的UI展示,所有人都很乐于去建议app应该怎么去展示UI.UI也是app和用户打交道的部分,直接对用户形成品牌意识,需要仔细的设计.无论你的app UI是简单还是复杂,重要的是性能一定要好. UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑这个问题.研究表明,0-100毫秒以内的延迟对人来说