安卓listview的view重用,Adapter适配器类,setTag,getTag的理解
listview用的“适配器类”中一般有这个写法:
public View getView(int position, View convertView, final ViewGroup parent) {
mInflater = (LayoutInflater) contxet.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.block_list_item, null);
holder = new ViewHolder();
holder.mAd_tv_show = (TextView) convertView.findViewById(R.id.ad_tv_show);
holder.mAd_btn_one = (Button) convertView.findViewById(R.id.ad_btn_one);
holder.mAd_btn_two = (Button) convertView.findViewById(R.id.ad_btn_two);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
。。。其它语句
是什么意思呢?
经研究,系统要显示listview中的其中一项listitem时,就会调用“适配器类”中的getView(int position, View convertView, final ViewGroup parent)。
这个函数方法是我们自己重写的,是由系统调用的,当要在屏上显示其中一个listitem项时,系统就会调用这个函数方法。
返回值view:我们返回这个listitem的view给系统,系统就把这个view显示出来。
position:系统会给出position值,表示要显示哪一个listitem。
convertView:系统会给出一个view,也可能是null。
因为每个listitem就是一个view!
比如listview中有100个listitem,当我们划动手指时,其它的listitem要显示出来,当每个listitem要显示出来时,系统都会调用getView()来得到这个listitem的view。不管你是上划,还是下划,即查看已显示过的listitem,也会调用getView()。
如果我们在getView()程序中每次都创建一个view出来,那我们下划到最后,就会有100个view被创建出来,我们再上划到最前面,又有100个view被创建出来,反复上下划,view就越来越多,系统就崩溃了。
所以,view是设定成可以重用的,只需要当前显示的view就够用了,,比如手机屏幕中只显示了3个listitem,其它listitem现在不用显示,则只需要3个view就可以了。我们只需要创建出3个view出来。当有一个listitem不再显示,它的view就可以被重用给要显示的新的listitem,就可以了。
系统自己会管理要重用的view,所以它调用getView()时,如果一个不再使用的view可以重用,它就把这个view作为convertView传递过来,让我们使用。如果没有可重用的view,它就传递null。这样我们在程序中就可以判断是否新建一个view了。
setTag()是把我们自己的数据依附到这个view中。当下次我们用这个view时,可以用getTag()取出自己的数据。
这个view中会有textview、button等,我们把它们存到自定义的ViewHolder中,再把ViewHolder依附setTag()到这个view中,供自己下次getTag()出来使用。。
文章评论(0条评论)
登录后参与讨论