編輯:關於Android編程
相信大家在很多時候都會用到ListView這個控件,因為確實是用的很多很多,但是有木有遇到過當數據很多很多的時候,往下滑ListView時有時候會卡頓,這就需要我們來優化它了。
ListView優化主要有下面幾個方面:
1、convertView重用
2、ViewHolder的子View復用
3、緩存數據復用
一、convertView重用
首先講下ListView的原理:ListView中的每一個Item顯示都需要Adapter調用一次getView()的方法,這個方法會傳入一個convertView的參數,這個方法返回的View就是這個Item顯示的View。如果當Item的數量足夠大,再為每一個Item都創建一個View對象,必將占用很多內存空間,即創建View對象(mInflater.inflate(R.layout.lv_item, null);從xml中生成View,這是屬於IO操作)是耗時操作,所以必將影響性能。Android提供了一個叫做Recycler(反復循環)的構件,就是當ListView的Item從滾出屏幕視角之外,對應Item的View會被緩存到Recycler中,相應的會從生成一個Item,而此時調用的getView中的convertView參數就是滾出屏幕的緩存Item的View,所以說如果能重用這個convertView,就會大大改善性能。
那麼,我們怎麼重用它呢?貼代碼:
如圖,當這個convertView不存在時,即第一次使用它,我們就創建一個item布局的View對象並賦給convertView,以後使用convertView時,只需從convertView中getTag取出來就可以,不需要再次創建item的布局對象了,這樣便提高了性能。
二、使用ViewHolder重用
我們都知道在getView()方法中的操作是這樣的:先從xml中創建view對象(inflate操作,我們采用了重用convertView方法優化),然後在這個view去findViewById,找到每一個item的子View的控件對象,如:ImageView、TextView等。這裡的findViewById操作是一個樹查找過程,也是一個耗時的操作,所以這裡也需要優化,就是使用ViewHolder,把每一個item的子View控件對象都放在Holder中,當第一次創建convertView對象時,便把這些item的子View控件對象findViewById實例化出來並保存到ViewHolder對象中。然後用convertView的setTag將viewHolder對象設置到Tag中, 當以後加載ListView的item時便可以直接從Tag中取出復用ViewHolder對象中的,不需要再findViewById找item的子控件對象了。這樣便大大提高了性能。
貼個完整的代碼:
內存洩漏和內存溢出是安卓開發中經常碰到的問題,如何能夠快速有效的發現並追蹤內存洩漏或者內存溢出的源頭,是每個開發者都需要掌握的技巧,今天我給大家帶來常見的內存分析工具使用
使用意圖調用內置應用程序 1、創建一個新的Android項目並命名為Intents,在main.xml文件中添加兩個Button: 2、
新建一個Android工程。 一 布局 先看效果圖: 打開main.xml修改內容如下:
谷歌的材料設計也發布了有一段時間了,包括官方的support庫 相信大家也熟悉了不少,今天就把actionbar 遷移到toolbar的 經驗發出來。 這個地方