关闭

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

标签: android性能UIAdapterinflate
682人阅读 评论(0) 收藏 举报
分类:

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,分段显示
当加载很多数据的时候可以考虑分段显示。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:146821次
    • 积分:3186
    • 等级:
    • 排名:第12165名
    • 原创:209篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    博客专栏
    最新评论