[置顶] ListView的优化(多方面)
2016-07-27 11:02
344 查看
在网上看了许多关于ListView优化的文章,自己也码了这么长时间代码关于ListView的优化也有自己的一点心得,下面是我对ListView优化的一些见解。
为什么要对ListView进行优化?
很多时候我们直接对ListView的适配器进行编写完成之后,运行程序,如果ListView中有很多item,你一直上下滑动的时候程序突然崩了,这就是因为你不停的滑动的时候,一直在Findviewbyid这样就会一直耗费程序的内存,导致崩溃;
如何对ListView进行优化?
1.使用viewholder
class ViewHolder {
ImageView iv_item_jzw;
TextView tv_fireplace_name;
ImageView iv_item_jzw_next;
}
2.复用convertView
利用 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View,如果重用 view 不改变宽高,重用View可以减少重新分配缓存造成的内存频繁分配/回收;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_xfroom, null);
holder.tv_fireplace_name = (TextView) convertView.findViewByI
4000
d(R.id.tv_fireplace_name);
holder.iv_item_jzw = (ImageView) convertView.findViewById(R.id.iv_item_xfs);
holder.iv_item_jzw_next = (ImageView) convertView.findViewById(R.id.iv_item_xfs_next);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
XFRoom temp = list.get(position);
holder.tv_fireplace_name.setText( temp.getXf_room_name());
if (position == 0) {
convertView.setBackgroundResource(R.drawable.list_item_top);
} else if (position == (list.size() - 1)) {
convertView.setBackgroundResource(R.drawable.list_item_bottom);
} else {
convertView.setBackgroundResource(R.drawable.list_item_def);
}
return convertView;
}
3.图片的加载优化
如果ListView需要加载显示网络图片,我们尽量不要在ListView滑动的时候加载图片,那样会使ListView变得卡顿,所以我们需要在监听器里面监听ListView的状态,如果ListView滑动(SCROLL_STATE_TOUCH_SCROLL)或者被猛滑(SCROLL_STATE_FLING)的时候,停止加载图片,如果没有滑动(SCROLL_STATE_IDLE),则开始加载图片。
4.减少item view的布局层级
这是所有layout都必须遵循的,布局层级过深会直接导致View的测量与绘制浪费大量的时间。
其他
1、利用好 View Type,例如你的 ListView 中有几个类型的 Item,需要给每个类型创建不同的 View,这样有利于 ListView
的回收,当然类型不能太多
2、善用自定义
View,自定义 View 可以有效的减小 Layout 的层级,而且对绘制过程可以很好的控制;
3、尽量能保证
Adapter 的 hasStableIds() 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView
将不会重新绘制这个
View,达到优化的目的;
4、每个Item
不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小
的
Item
5、ListView
中元素避免半透明
6、使用
RecycleView 代替, ListView 每次更新数据都要 notifyDataSetChanged(),,RecycleView 在性能和可定制性上
都有很大的改善,推荐使用。
为什么要对ListView进行优化?
很多时候我们直接对ListView的适配器进行编写完成之后,运行程序,如果ListView中有很多item,你一直上下滑动的时候程序突然崩了,这就是因为你不停的滑动的时候,一直在Findviewbyid这样就会一直耗费程序的内存,导致崩溃;
如何对ListView进行优化?
1.使用viewholder
class ViewHolder {
ImageView iv_item_jzw;
TextView tv_fireplace_name;
ImageView iv_item_jzw_next;
}
2.复用convertView
利用 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View,如果重用 view 不改变宽高,重用View可以减少重新分配缓存造成的内存频繁分配/回收;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_xfroom, null);
holder.tv_fireplace_name = (TextView) convertView.findViewByI
4000
d(R.id.tv_fireplace_name);
holder.iv_item_jzw = (ImageView) convertView.findViewById(R.id.iv_item_xfs);
holder.iv_item_jzw_next = (ImageView) convertView.findViewById(R.id.iv_item_xfs_next);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
XFRoom temp = list.get(position);
holder.tv_fireplace_name.setText( temp.getXf_room_name());
if (position == 0) {
convertView.setBackgroundResource(R.drawable.list_item_top);
} else if (position == (list.size() - 1)) {
convertView.setBackgroundResource(R.drawable.list_item_bottom);
} else {
convertView.setBackgroundResource(R.drawable.list_item_def);
}
return convertView;
}
3.图片的加载优化
如果ListView需要加载显示网络图片,我们尽量不要在ListView滑动的时候加载图片,那样会使ListView变得卡顿,所以我们需要在监听器里面监听ListView的状态,如果ListView滑动(SCROLL_STATE_TOUCH_SCROLL)或者被猛滑(SCROLL_STATE_FLING)的时候,停止加载图片,如果没有滑动(SCROLL_STATE_IDLE),则开始加载图片。
4.减少item view的布局层级
这是所有layout都必须遵循的,布局层级过深会直接导致View的测量与绘制浪费大量的时间。
其他
1、利用好 View Type,例如你的 ListView 中有几个类型的 Item,需要给每个类型创建不同的 View,这样有利于 ListView
的回收,当然类型不能太多
2、善用自定义
View,自定义 View 可以有效的减小 Layout 的层级,而且对绘制过程可以很好的控制;
3、尽量能保证
Adapter 的 hasStableIds() 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView
将不会重新绘制这个
View,达到优化的目的;
4、每个Item
不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小
的
Item
5、ListView
中元素避免半透明
6、使用
RecycleView 代替, ListView 每次更新数据都要 notifyDataSetChanged(),,RecycleView 在性能和可定制性上
都有很大的改善,推荐使用。
相关文章推荐
- Jemter
- RAC之masonry源码深度解析
- cocos2dx 项目拷贝遇到的一些问题
- poj1321
- 欢迎使用CSDN-markdown编辑器
- 提交审核配置IDFA信息
- 安装tensorflow
- notepad++ 设置
- Javabean转换成json字符串的工具类
- 5个常用的排序算法总结
- 【00】KVM中小企业实践-目录
- 树莓派 让vim支持python
- 插入多行数据的时候,一个insert插入多行
- poj 1330 Nearest Common Ancestors(并查集?!二分查找)
- JSON与XML的区别比较
- NT kernel & System 占用占用80端口
- Jackson常用注解介绍
- 数据结构实验之链表二:逆序建立链表
- 数据结构上机测试1:顺序表的应用
- iOS新特性实现3DTouch开发