listview效率最高的一种方式

public class Custom_BaseAdapterActivity extends ListActivity {  
  
    List<Map<String,Object>> list;  
      
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
          
        list = getListData();  
        setContentView(R.layout.listdemo2);  
          
        MyAdapter myAdapter = new MyAdapter(this);  
        setListAdapter(myAdapter);  
    }  
      
    public List<Map<String,Object>> getListData(){  
        list = new ArrayList<Map<String,Object>>();  
          
        Map<String,Object> map1 = new HashMap<String,Object>();  
        Map<String,Object> map2 = new HashMap<String,Object>();  
        map1.put("headimg", R.drawable.lxq);  
        map1.put("nickname", "蜗牛/");  
        map1.put("textsign", "乘着风游荡在蓝天边 一片云掉落在我面前.");  
          
        map2.put("headimg", R.drawable.hyl);  
        map2.put("nickname", "轩凌涵舞");  
        map2.put("textsign", "以后我儿子得有两门必修课,打篮球和拉小提琴.");  
          
        list.add(map1);  
        list.add(map2);  
          
        return list;  
    }  
      
    public final class ViewHolder{  
        public ImageView headimg;  
        public TextView nickname;  
        public TextView textsign;  
        public Button listbtn;  
    }  
      
    public class MyAdapter extends BaseAdapter{  
          
        private LayoutInflater flater;  
          
        public MyAdapter(Context context) {  
            super();  
            this.flater = LayoutInflater.from(context);  
        }  
  
        public int getCount() {  
            // TODO Auto-generated method stub  
            return list.size();  
        }  
  
        public Object getItem(int arg0) {  
            // TODO Auto-generated method stub  
            return null;  
        }  
  
        public long getItemId(int arg0) {  
            // TODO Auto-generated method stub  
            return 0;  
        }  
  
        public View getView(int position, View convertView, ViewGroup parent) {  
            // TODO Auto-generated method stub  
            ViewHolder holder = null;  
            if(convertView == null){  
                holder = new ViewHolder();  
                convertView = flater.inflate(R.layout.user2, null);  
                holder.headimg = (ImageView) convertView.findViewById(R.id.headimg);  
                holder.nickname = (TextView) convertView.findViewById(R.id.nickname);  
                holder.textsign = (TextView) convertView.findViewById(R.id.textsign);  
                holder.listbtn = (Button) convertView.findViewById(R.id.listbtn);  
                convertView.setTag(holder);  
            }  
            else{  
                holder = (ViewHolder) convertView.getTag();  
            }  
            holder.headimg.setBackgroundResource((Integer)list.get(position).get("headimg"));  
            holder.nickname.setText((String)list.get(position).get("nickname"));  
            holder.textsign.setText((String)list.get(position).get("textsign"));  
            holder.listbtn.setOnClickListener(new View.OnClickListener() {  
                public void onClick(View arg0) {  
                }  
            });  
            return convertView;  
        }  
    }  
}  



只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。 


而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。 


ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,就本例而言只是创建了9个ViewHolder实例。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值