ListView的优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ListView的优化
∙convertView重用(内存优化)
∙ViewHolder优化(时间优化)
∙图片加载优化
∙子控件事件处理
∙减少布局层级
∙getView需要注意的几个方面
1.convertView重用
getView(int position, View convertView, ViewGroup parent)
1)在初始显示的时候,每次显示一个item都调用一次getview方法但是每次调用的时
候covertview为空(因为还没有旧的view).
2)当显示完了之后,如果屏幕移动了之后,并且导致有些Item(也可以说是view)跑
到屏幕外面,此时如果还有新的item需要产生,则这些item显示时调用的getview 方法中的convertview参数就不是null,而是那些移出屏幕的view(旧view),我们所要做的就是将需要显示的item填充到这些回收的view(旧view)中去
3)最后注意convertview为null的不仅仅是初始显示的那些item,还有一些是已经
开始移入屏幕但是还没有显示的item。
2.ViewHolder优化
使用ViewHolder的原因是findViewById方法耗时较大,如果控件个数过多,会严重影响性能,而使用ViewHolder主要是为了可以省去这个时间。
通过setTag,getTag直接获取View
3.图片加载优化
如果ListView需要加载显示网络图片,我们尽量不要在ListView滑动的时候加载图片,那样会使ListView变得卡顿,所以我们需要在监听器里面监听ListView的状态,如果ListView滑动(SCROLL_STATE_TOUCH_SCROLL)或者被猛滑(SCROLL_STATE_FLING)的时候,停止加载图片,如果没有滑动(SCROLL_STATE_IDLE),则开始加载图片。
4.子控件事件处理
1)当ListView的item中有比如button这些子view时,需要对其设置onclickListener,
通常的写法是在getView方法中一个个设置,比如
holder.img.setonClickListener(new onClickListenr)..., 但是这种写法每次调
用getView时都设置了一个新的onClick事件,效率很低。
高效的写法可以直接在
ViewHolder中设置一个position,然后viewHolder implements OnClickListenr:
2)ListView的listitem里面含有Button CheckBox之类的子控件的时候,子控件会
把Focus抢去,最简单有效的解决方法是在ListView的item布局文件根元素中设置属性android:descendantFocusability=”blocksDescendants”
5.减少布局层级
布局层级过深会直接导致View的测量与绘制浪费大量的时间
6.使用getView需要注意
使用getView应该注意如下几个方面:
1)adapter中的getView方法尽量少使用逻辑
2)adapter中的getView方法尽量少做耗时操作
3)adapter中的getView方法避免创建大量对象。