Android学习-1:ListView优化

     今天在做项目的时候,有用到ListView,每一个item包含了太多的组件,一旦数据过多,刷新加载的时候就出现卡顿的情况,继而想到了ListView的优化,可又不会。只能去百度了,看了太多的资料,决定自己学一份,加深印象。努力学习,天天向上。

    参考文章:http://blog.csdn.net/long704480904/article/details/8144939

                       http://mzh3344258.blog.51cto.com/1823534/889879

                                                   http://www.cnblogs.com/xilinch/archive/2012/11/08/2760233.html

                                            http://www.cnblogs.com/over140/archive/2011/03/23/1991100.html

                                         http://www.cnblogs.com/over140/archive/2011/04/06/2006615.html


ListView的工作原理:

    ListView针对每个Item,要求adapter 返回一个视图(GetView),也就是在开始绘制的时候,系统首先调用getCount()函数,根据它的返回值得到listview的长度,调用getView()一行一行的绘制Listvie的每一项。如果你的getCount()返回的是0的话,列表一行都不会显示,如果返回1,就只显示一行。返回几则显示几行。如果我们有几千几万甚至更多的item要显示怎么办?为每个Item创建一个新的View?不可能!!!实际上Android早已经缓存了这些视图。


下面简单说下上图的原理:

  1. 如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目存在内存(内存内存哦,说的优化就是说在内存中的优化!!!)中,其他的在Recycler中
  2. ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的
  3. 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图

  
ListView中只有第一屏的item需要新建,它的引用会被存在RecycleBin对象内,在拖动时后面的item实际上是重从了之前创建的item。
3. 根据上述,ListView在需要显示item时,最开始第一屏时,getView(int position, View convertView, ViewGroup parent )的第二个参数为null,显示第二屏或者回滚显示第一屏时,getView(int position, View convertView, ViewGroup parent )第二个参数是一个原来缓存的item,我们只需要在getView中把它内部数据更新即可。
4. 如果item结构比较复杂,在更新一个已有的item内部数据的时候,查找item内部每一个元素也需要占用不少资源,所以,可以把这些内部元素的引用缓存起来,直接对其赋值,最有效的方法是把这些引用存到对应的item中,比较好的方法是使用setTag()方法。

据上四条,可得出:
1. 在adapter的getView(int position, View convertView, ViewGroup parent)方法中,每次都new一个新的View返回,是性能最差的,浪费了ListView巧妙设计的一片苦心。
2. 如果item内部元素简单,getView中如果传进来的view不为空,直接为其赋值即可。
3. 如果item内部元素复杂,可以使用Google IO 大会中讨论的方法优化(如下):
public View getView(int position, View convertView, ViewGroup parent) {        
    ViewHolder holder;
    if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
            holder = new ViewHolder();
            holder.icon1 = (ImageView) convertView.findViewById(R.id.icon1);
            holder.text1 = (TextView) convertView.findViewById(R.id.text1);
            convertView.setTag(holder);
    }
    else{
            holder = (ViewHolder)convertView.getTag();
    }
        holder.icon1.setImageResource(R.drawable.icon);
        holder.text1.setText(mData[position]);
        return holder;
}
static class ViewHolder {
        TextView text1;
        ImageView icon1;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值