ListView的优化

来源:互联网 发布:金融网络销售好做吗 编辑:程序博客网 时间:2024/06/06 03:48

谷歌IOS大会提出的这东西 虽然大家都一直在用 可原理啥的大家一知半解

ListView 针对每个item,要求 adapter “返回一个视图” (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView的每一项。如果你的getCount()返回值是0的话,列表一行都不会显示,如果返回1,就只显示一行。返回几则显示几行;并且ListView缓存了可视范围的View,所以在在你重新查看以前的View时,可以通过tag方式来设置并获取当前数据

简单实例:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.android.listviewtest;  
  2.   
  3. import java.util.LinkedHashMap;  
  4. import java.util.Map;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.view.LayoutInflater;  
  9. import android.view.Menu;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.view.ViewGroup;  
  13. import android.widget.BaseAdapter;  
  14. import android.widget.Button;  
  15. import android.widget.ListView;  
  16. import android.widget.TextView;  
  17. import android.widget.Toast;  
  18.   
  19. public class MainActivity extends Activity {  
  20.   
  21.     //定义view缓存对象  
  22.     static class HolderView {  
  23.         TextView showName;  
  24.         TextView showInfo;  
  25.     }  
  26.   
  27.     //一次装载 多次显示  
  28.     private Map<String, String> maps;  
  29.     // 显示的页数  
  30.     private int page = 1;  
  31.   
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.activity_main);  
  36.         maps=new LinkedHashMap<String, String>();  
  37.         for (int i = 0; i < 100; i++) {  
  38.             maps.put("熊"+i, "程序员"+i+"号");  
  39.         }  
  40.         Button btshow = (Button) findViewById(R.id.bt_show);  
  41.         ListView showlist = (ListView) findViewById(R.id.listshow);  
  42.         final ShowName showName = new ShowName();  
  43.         showlist.setAdapter(showName);  
  44.         btshow.setOnClickListener(new OnClickListener() {  
  45.   
  46.             @Override  
  47.             public void onClick(View v) {  
  48.                 if (page< 100 / 5) {  
  49.                     page++;  
  50.                     showName.notifyDataSetChanged();  
  51.                 }else{  
  52.                     Toast.makeText(MainActivity.this"没有多余的数据了", Toast.LENGTH_LONG).show();  
  53.                 }  
  54.             }  
  55.         });  
  56.     }  
  57.   
  58.     class ShowName extends BaseAdapter {  
  59.   
  60.         // 每次加载5条数据  
  61.         @Override  
  62.         public int getCount() {  
  63.             return page * 5;  
  64.         }  
  65.   
  66.         @Override  
  67.         public Object getItem(int position) {  
  68.   
  69.             return position;  
  70.         }  
  71.   
  72.         @Override  
  73.         public long getItemId(int position) {  
  74.             // TODO Auto-generated method stub  
  75.             return position;  
  76.         }  
  77.   
  78.         @Override  
  79.         public View getView(int position, View convertView, ViewGroup parent) {  
  80.             HolderView holderView;  
  81.             //判断每一个item中的view是否已经存在  
  82.             if (convertView == null) {  
  83.                 //加载view  
  84.                 convertView = LayoutInflater.from(MainActivity.this).inflate(  
  85.                         R.layout.show_name, null);  
  86.                 holderView = new HolderView();  
  87.                 holderView.showName = (TextView) convertView  
  88.                         .findViewById(R.id.txt1);  
  89.                 holderView.showInfo = (TextView) convertView  
  90.                         .findViewById(R.id.txt2);  
  91.                 //添加一个额外的数据  
  92.                 convertView.setTag(holderView);  
  93.             } else {  
  94.                 holderView = (HolderView) convertView.getTag();  
  95.             }  
  96.             String name=((maps.keySet().toArray())[position]).toString();  
  97.             String info=maps.get(name);  
  98.             holderView.showName.setText(name);  
  99.             holderView.showInfo.setText(info);  
  100.             return convertView;  
  101.         }  
  102.   
  103.     }  
  104.   
  105.     @Override  
  106.     public boolean onCreateOptionsMenu(Menu menu) {  
  107.         getMenuInflater().inflate(R.menu.main, menu);  
  108.         return true;  
  109.     }  
  110.   
0 0
原创粉丝点击