Android性能:经典ListView适配器convertView缓存及复用机制

来源:互联网 发布:黄梅戏软件 编辑:程序博客网 时间:2024/05/28 16:24
Android中的ListView常用Adapter中都会涉及到convertView的使用,使用convertView主要是为了缓存试图View,用以增加ListView的item view加载效率。有经验的Android开发者通常知道在Adapter的getView中,先判断convertView是否为空null,如果非空,则直接再次对convertView复用,否则才创建新的View。为何要复用convertView呢?参见我之前写的附录文章1。那么Android是如何维护convertView这一机制的运转呢?
(一)当第一次打开Android的ListView初始化时候,在Adapter中此时的convertView无疑均是空的,Android将创建新的convertView,创建多少呢?答案是一屏ListView有多少条item,就创建多少个convertView,注意,这仅仅是在第一次初始化ListView展现item时候才是这样的convertView创建机制,以一个ListView配置一个ArrayAdapter,写例子:
[java] view plain copy
  1. package zhangphil.demo;  
  2.   
  3. import android.app.ListActivity;  
  4. import android.os.Bundle;  
  5. import android.support.annotation.NonNull;  
  6. import android.support.annotation.Nullable;  
  7. import android.util.Log;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.ArrayAdapter;  
  12. import android.widget.TextView;  
  13.   
  14. public class MainActivity extends ListActivity {  
  15.     private int tagId = 0;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.   
  21.         ArrayAdapter mAdapter = new ArrayAdapter(this0) {  
  22.             private TextView text1;  
  23.             private TextView text2;  
  24.   
  25.             @NonNull  
  26.             @Override  
  27.             public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {  
  28.                 if (convertView == null) {  
  29.                     convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_2, null);  
  30.                     //convertView.setMinimumHeight(400);  
  31.   
  32.                     Log.d("位置" + position, "创建新convertView,设置tagId:" + tagId);  
  33.                     convertView.setTag(tagId++);  
  34.                 } else {  
  35.                     Log.d("位置" + position, convertView.getTag() + " 复用convertView");  
  36.                 }  
  37.   
  38.                 text1 = convertView.findViewById(android.R.id.text1);  
  39.                 text1.setTextColor(getResources().getColor(android.R.color.holo_blue_bright));  
  40.                 text1.setText(getItem(position));  
  41.   
  42.                 text2 = convertView.findViewById(android.R.id.text2);  
  43.                 text2.setTextColor(getResources().getColor(android.R.color.holo_red_light));  
  44.                 text2.setText("convertView tagId:" + String.valueOf(convertView.getTag()));  
  45.   
  46.                 return convertView;  
  47.             }  
  48.   
  49.             @Nullable  
  50.             @Override  
  51.             public String getItem(int position) {  
  52.                 return "位置position:" + position;  
  53.             }  
  54.   
  55.             @Override  
  56.             public int getCount() {  
  57.                 return 99999;  
  58.             }  
  59.         };  
  60.   
  61.         setListAdapter(mAdapter);  
  62.     }  
  63. }  






宁波整容整形医院  http://www.lyxcl.org/
阅读全文
0 0