listview 性能优化总结

来源:互联网 发布:linux命令进入e盘 编辑:程序博客网 时间:2024/06/16 16:24

1、android:layout_height属性:

        必须将ListView的布局高度属性设置为非“wrap_content”(可以是“match_parent /  fill_parent  /  400dp等绝对数值”),如果ListView的布局高度为“wrap_content”,那么getView()就会重复调用。一般来说,一个item会被调用三次左右。

 

2、ViewHolder:

        利用ViewHolder内部类,将item布局文件中需要展示的控件定义为属性(其实ViewHolder就是一个自定义的模型类)。这样就把item中散在的多个控件合成一个整体,这样可以有效地避免图片错位。

 

3、convertView:

        ListView的加载是一个item一个item的加载,这样就会每次都inflate一个item布局,然后findViewById一遍该布局上的所有控件。当数据量大的时候,是不可想象的。而利用Recycle回收利用就可以解决问题。所以要善于重复利用convertView,这样可以减少填充布局的过程,减少ViewHolder对象实例化的次数。减少内存开销,提高性能。

 

4、convertView的setTag():

        利用setTag()方法将ViewHolder对象作为标签附加到convertView上,当convertView被重复利用的时候,因为上面有ViewHolder对象,所以convertView就具有了ViewHolder中的几个属性,这样就节省了findViewById()这个过程。如果一个item有三个控件,如果有100条item,那么在加载数据过程中,就就相当于节省了几百次findViewById(),节约了执行findViewById()的时间,提升了加载速度,节省了性能的开销。

 

5、LayoutInflater对象的inflate()方法:        

    inflate()方法一般接收两个参数,第一个参数就是要加载的布局id,第二个参数是指给该布局的外部再嵌套一层父布局,如果不需要就直接传null。

    inflate()方法还有个接收三个参数的方法重载

1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。2. 如果root不为null,attachToRoot设为true,则会在加载的布局文件的最外层再嵌套一层root布局。3. 如果root不为null,attachToRoot设为false,则root参数失去作用。4. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。

        所以在使用LayoutInflater填充布局的时候,要注意inflate()方法的参数。如果是两个参数,则第二个参数可以采用null;如果使用三个参数的方法,则要注意参数之间的搭配。

 

6、监听屏幕的滚动状态的变动情况:

    ListView对象有OnScrollListener监听器。其回调方法onScrollStateChanged(AbsListView view, int scrollState)的第二个参数就是屏幕滚动状态。

  scrollState = SCROLL_STATE_TOUCH_SCROLL(1):表示正在滚动。当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1

  scrollState =SCROLL_STATE_FLING(2) :表示手指做了抛的动作(手指离开屏幕前,用力滑了一下,屏幕产生惯性滑动)。 

  scrollState =SCROLL_STATE_IDLE(0) :表示屏幕已停止。屏幕停止滚动时为0。

    在以上三种屏幕滚动状态中,如果还处于SCROLL_STATE_FLING状态,则说明屏幕还处于惯性滑动状态,此时可以不进行异步加载图片。这样可以节省不必要的性能开销。


建议:

1、使用ListView的时候注意尽量使用layout_height=”match_parent”。

2、如果第1点无法避免,需要注意ListView的父布局,父布局以上绝对不要使用RelativeLayout,即使使用FrameLayout或LinearLayout会增加布局层级。

3、如果第1点无法避免,需要注意不要在getView中使用setVisibility这种会触发ListView重新onMeasure的操作。

4、如果ListView存在位移,比如下来刷新等,绝对要遵循第1点来设置layout_height=”match_parent”,不然频繁触发onMeasure会导致交互卡顿。

5、关于NoScrollListView,这种布局是严禁使用的,无论是哪种场景,如果ScrollView中必须要使用ListView,可以使用SimulateListView控件代替ListView https://github.com/MegatronKing/SimulateListView

6、由于GridView的measure机制和ListView有些差别,虽然同样会有性能损耗但不大,不过还是建议开发者遵循以上几点!

7、在adapter中的getView方法中尽量少使用逻辑

8、尽最大可能避免GC

9、滑动的时候不加载图片

10、item的布局层级越少越好

11、尽量避免在ListView适配器中使用线程

12、将ListView的scrollingCache和animateCache设置为false

13、如果布局很复杂,可以考虑自定义布局能不能实现


原创粉丝点击