ListView性能优化
2015-08-17 22:51
489 查看
前期ListView列表存在的问题:
每个列表项都是新建出来的,存在两个耗时的地方
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.phone_item_2, null);
TextView name = (TextView) v.findViewById(R.id.name);
上面两个方法要尽可能少的调用
为了提高手机滑动的流畅性
解决办法
View的重用
View的每次创建是比较耗时的,因此对于getView方法传入的
convertView应充分利
ViewHolder的应用
View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,
之后就用View.getTag()方法来获得ViewHolder对象
Recycler的运行机制:
Adapter中的public View getView(int position, View convertView,
ViewGroup arg2)
这个方法是ListView性能好坏的关键。方法中有个convertView,
这个是Android在 为我们而做的缓存机制。
ListView中每个item都是通过getView返回并显示的,假如item有很多个,
那么重复创建这么多对象来显示显然是不合理。因 此,Android提供了
Recycler,将没有正在显示的item放进RecycleBin(回收站),然后在显
示新视图时从RecycleBin中复用这个 View。
Recycler原理图:
案例:
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
ViewHolder viewHolder = null;
if(convertView==null){
LayoutInflater layoutInflater = LayoutInflater.from(context);
viewHolder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.call_item, null);
viewHolder.call_item_tv_familyname = (TextView) convertView.findViewById(R.id.call_item_tv_familyname);
viewHolder.call_item_tv_name = (TextView) convertView.findViewById(R.id.call_item_tv_name);
viewHolder.call_item_tv_phone = (TextView) convertView.findViewById(R.id.call_item_tv_phone);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
User2 user = user2List.get(position);
viewHolder.call_item_tv_familyname.setText(user.getFamilyName());
viewHolder.call_item_tv_name.setText(user.getName());
viewHolder.call_item_tv_phone.setText(user.getPhone());
viewHolder.call_item_tv_familyname.setBackgroundColor(colorId[getRandomNum()]);
return convertView;
}
final class ViewHolder{
TextView call_item_tv_familyname;
TextView call_item_tv_name;
TextView call_item_tv_phone;
}
convertView在屏幕可以容纳item时,每一次都是空的,只有当item的数量超出
手机屏幕所能容纳的数量时,滚出手机屏幕的那个item会放入convertView中等待
重用。
每个列表项都是新建出来的,存在两个耗时的地方
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.phone_item_2, null);
TextView name = (TextView) v.findViewById(R.id.name);
上面两个方法要尽可能少的调用
为了提高手机滑动的流畅性
解决办法
View的重用
View的每次创建是比较耗时的,因此对于getView方法传入的
convertView应充分利
ViewHolder的应用
View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,
之后就用View.getTag()方法来获得ViewHolder对象
Recycler的运行机制:
Adapter中的public View getView(int position, View convertView,
ViewGroup arg2)
这个方法是ListView性能好坏的关键。方法中有个convertView,
这个是Android在 为我们而做的缓存机制。
ListView中每个item都是通过getView返回并显示的,假如item有很多个,
那么重复创建这么多对象来显示显然是不合理。因 此,Android提供了
Recycler,将没有正在显示的item放进RecycleBin(回收站),然后在显
示新视图时从RecycleBin中复用这个 View。
Recycler原理图:
案例:
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
ViewHolder viewHolder = null;
if(convertView==null){
LayoutInflater layoutInflater = LayoutInflater.from(context);
viewHolder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.call_item, null);
viewHolder.call_item_tv_familyname = (TextView) convertView.findViewById(R.id.call_item_tv_familyname);
viewHolder.call_item_tv_name = (TextView) convertView.findViewById(R.id.call_item_tv_name);
viewHolder.call_item_tv_phone = (TextView) convertView.findViewById(R.id.call_item_tv_phone);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
User2 user = user2List.get(position);
viewHolder.call_item_tv_familyname.setText(user.getFamilyName());
viewHolder.call_item_tv_name.setText(user.getName());
viewHolder.call_item_tv_phone.setText(user.getPhone());
viewHolder.call_item_tv_familyname.setBackgroundColor(colorId[getRandomNum()]);
return convertView;
}
final class ViewHolder{
TextView call_item_tv_familyname;
TextView call_item_tv_name;
TextView call_item_tv_phone;
}
convertView在屏幕可以容纳item时,每一次都是空的,只有当item的数量超出
手机屏幕所能容纳的数量时,滚出手机屏幕的那个item会放入convertView中等待
重用。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories