getView的原理



public  View getView( int  position, View convertView, ViewGroup parent) 

ListView控件中的viewitem数目只能刚好充满屏幕,翻页的过程中它只是用旧的view显示新的数据 ,所以 convertView参数 有可能是null 有可能不是null .

[1]ListView asks adapter “give me a view” (getView) for each item of the list.(通过getView来获取每个item)

[2]A new View is returned and displayed(获取到后返回显示)

那么如果我们有大量的数据需要显示的时候,每个Item都去重复执行getView中的创建新的View的动作吗?这样做会耗费大量的资源去执行重复的事情,实际上Android为我们提供了一套重复利用的机制叫做Recycler”:

原理简单描述下就是这样:

在一个完整的ListView第一次出现时,每个Item都是Null的,getView的时候会跑到需要inflate一个Item的代码段,假设整个view只能最多显示10个item,那么当滑动到第11个Item的时候,第一个item会放入“recycler”,如果第11个Item和放入“Recycler”的item的view一致,那么就会使用"Recycler"里面的Item来显示,从而不用再重复inflate一次,这样大大节省了创建View的工作,在需要显示大量数据时显得尤为重要。

工作原理的示意图如下:

等所有的item,一共10个都显示之后,不管上下滑动都再也不是NULL了,说明这个时候都是使用Recycle里面的view,而不会再重新inflate了,显然这样节省很多重复的操作。

例如在一下代码中:

convertView有时为空,有时不为空,返回的<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; font-weight: bold; line-height: 26px;">convertView为其中一项的布局;

 
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(R.layout.gallery1_item,
					null);
		}
		ImageView img = (ImageView) convertView.findViewById(R.id.home_img);
		img.setImageResource(res[position]);
		return convertView;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值