ListView优化的流程

来源:互联网 发布:李涛疯狂淘宝是真的吗 编辑:程序博客网 时间:2024/06/11 14:30

1. ListView是通过适配器adapter的设置最终将它的空间和匹配的数据显示在Activity界面,最直观的就是在Adapter中通过方法getView(int position, View convertView, ViewGroup parent)解析ListView的条目item,最原始的方法如下:

public View getView(int position, View convertView, ViewGroup parent) {
// 1. 获取列表项的数据
Contact contact = contacts.get(position);
// 2. 获取显示列表项的View对象,通过模板加载得到
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.contact_item, null);
// 3. 组装数据中的各个属性与View对象中的各个控件
TextView sortKey = (TextView) view.findViewById(R.id.tv_contact_item_sort_key);
TextView name = (TextView) view.findViewById(R.id.tv_contact_item_name);
TextView number = (TextView) view.findViewById(R.id.tv_contact_item_number);
sortKey.setText("" + contact.getName().charAt(0));
name.setText(contact.getName());
number.setText(contact.getNumber());
// 4. 返回组装数据后的View对象
return view;
}

效果如图:



ListView实际运行中只有第一屏的item需要新建,那么这样会带来一个问题,当上下滑动ListView时,滑出去的控件view不会销毁,但每滑进来一个View,系统就会新建并且解析一个View,而每个控件会占用系统的内存,当连续快速滑动多次后(尤其是有高清图片的item占用内存更多),系统内存便会溢出崩溃,而且LayoutInflate的inflater解析控件inflate和findViewById()是耗时操作,大量的解析操作会造成系统卡顿,于是便出现一种循环机制,将已经滑出屏幕的控件存在RecycleBin对象内,当屏幕上边滑出一个View,将此View存入RecycleBin对象内,屏幕下边滑进来的item便会到RecycleBin对象内找一个空置的View来设置匹配数据,不用再重新新建View对象.

adapter循环机制优化代码如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 1.获取列表项的数据
Contact contact=contacts.get(position);
//2.获取显示列表项的View对象,通过模板加载得到
ViewHolder holder;
if(convertView==null){
LayoutInflater inflater=LayoutInflater.from(context);
convertView=inflater.inflate(R.layout.contact_item, null);
holder=new ViewHolder();
holder.tv_firstWord=(TextView)convertView.findViewById(R.id.tv_firstword);
holder.tv_name=(TextView)convertView.findViewById(R.id.tv_name);
holder.tv_number=(TextView)convertView.findViewById(R.id.tv_number);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
//3.行模板中填充数据
holder.tv_firstWord.setText(""+contact.getName().charAt(0));
holder.tv_name.setText(contact.getName());
holder.tv_number.setText(contact.getNumber());
//4.返回view对象
return convertView;
}


private class ViewHolder{
TextView tv_firstWord;
TextView tv_name;
TextView tv_number;
}

上述代码界面运行效果不变,但运行效率和内存占用量大大减少,提高程序的运行效率.如果item结构比较复杂,在更新一个已有的item内部数据的时候,查找item内部每一个元素也需要占用不少资源,所以,可以把这些内部元素的引用缓存起来,直接对其赋值,最有效的方法是把这些引用存到对应的item中,比较好的方法是使用setTag()方法。





0 0
原创粉丝点击