第一种方法
重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。 特点:如果当前的convertView为null,则通过LayoutInflat产生一个view。
1 ViewCode 2 public View getView(int position, View convertView, ViewGroup parent) { 3 if (convertView == null) { 4 convertView = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 5 } 6 TextView tv_name = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 7 TextView tv_phone = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 8 ContactInfo1 confo = contacts.get(position); 9 if (confo != null) {//to set every item's text 10 tv_name.setText(confo.getContactName()); 11 tv_phone.setText(confo.getContact_Phone()); 12 } 13 return convertView; 14 }
上面的写法会有一个缺点,就是每次在getVIew的时候,都需要重新的findViewById,重新找到控件,然后进行控件的赋值以及事件相应设置。这样其实在做重复的事情,因为的geiview中,其实包含有这些控件,而且这些控件的id还都是一样的,也就是其实只要在view中findViewById一次,后面无需要每次都要findViewById了。
第二种方法
-
第二种写法写发的特点,通常有一个内部类classViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,比如onClick等等,这样可以不用每次都要findViewById了,减少了性能的消耗。同时重用了convertView,很大程度上的减少了内存的消耗。
1 public View getView (int position, View convertView, ViewGroup parent) { 2 ViewHolder holder; 3 if (convertView == null) { 4 convertView = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 5 holder = new ViewHolder(); 6 holder.tv_name = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 7 holder.tv_phone = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 8 convertView.setTag(holder); 9 } else { 10 holder = (ViewHolder)convertView.getTag(); 11 } 12 ContactInfo1 confo = contacts.get(position); 13 Log.i("my","confo"+confo.getContactName()); 14 if (confo != null) {//to set every item's text 15 holder.tv_name.setText(confo.getContactName()); 16 holder.tv_phone.setText(confo.getContact_Phone()); 17 } 18 return convertView; 19 } 20 classViewHolder 21 { 22 TextViewtv_name,tv_phone; 23 }
第三种方法
使用了内部类classViewHolder、重用了convertView。
区别第二种写法是,使用了一个临时变量Viewview=convertView,然后修改view,最后返回view
复制代码 代码如下:1 @Override 2 public View getView(int position,View convertView,ViewGroup parent) 3 { 4 View view = convertView; 5 ViewHolder holder; 6 if (view == null) { 7 view = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 8 holder = newViewHolder(); 9 holder.tv_name = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); 10 holder.tv_phone = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 11 view.setTag(holder); 12 } else { 13 holder = (ViewHolder)view.getTag(); 14 } 15 ContactInfo confo = contacts.get(position); 16 Log.i("my", "confo" + confo.getContactName()); 17 if (confo != null) {//to set every item's text 18 holder.tv_name.setText(confo.getContactName()); 19 holder.tv_phone.setText(confo.getContact_Phone()); 20 } 21 return view; 22 } 23 static class ViewHolder { 24 TextView tv_name, tv_phone; 25 }
这里设置ViewHolder为static,也就是静态的,静态类只会在第一次加载时会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销。