ListView和GridView列表滑動卡頓問題的優化方法彙總
ListView和GridView列表在滑動時出現卡頓現象困擾了很多開發者,下面我們來總結一下優化方案:
1. 使用ViewHolder
在adapter的getView方法中對convertView setTag(viewHolder),這個是大部分開發者都會去用的方案,它的原理是避免重複通過inflate方法去渲染UI,只要set了tag,view就可以被重用,這裡不做詳細贅述了。
2. getView方法中不要進行耗時操作
比如我們可能需要在getView中載入bitmap,而這是一個耗時的操作,需要用非同步的方式去處理(最好是通過執行緒池,它可以避免由於頻繁建立和銷燬執行緒所帶來的系統開銷,關於執行緒池的原理和使用可以參考部落格
3. 圖片的載入採用三級快取的方式實現
載入網路圖片時,應先嚐試從記憶體快取中獲取,如果沒有再從硬碟快取(檔案快取)獲取,還是沒有才會從網路中下載。其實不只是圖片,所有檔案都可以通過三級快取方式來加快載入速度避免重複從網路中下載。關於記憶體快取和硬碟快取的實現,可以參考部落格http://blog.csdn.net/whsdu929/article/details/52672746。
4. 列表在滑動過程中不載入,停止時才載入
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE){
mIsScroll = false;
}else{
mIsScroll = true;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
然後在getView中進行判斷,只有當mIsScroll為false時才去執行載入圖片等非同步操作。這裡可以根據自己的需要去設定判斷條件,除了SCROLL_STATE_IDLE以外,OnScrollListener還要兩種狀態:SCROLL_STATE_TOUCH_SCROLL(手指在螢幕上滑動)和SCROLL_STATE_FLING(手指離開螢幕之後的慣性滑動)。
5. 壓縮圖片大小
使用BitmapFactory載入bitmap時,由於會按圖片的原始畫素分配記憶體,所以極易發生記憶體洩漏。可以通過BitmapFactory.Options來壓縮圖片,改變它的取樣率,具體的原理和編碼方式可參考部落格:http://blog.csdn.net/whsdu929/article/details/52524439
6. 開啟硬體加速
可以設定activity的屬性:android:hardwareAccelerated=”true”以開啟硬體加速。
7. 其他細節改善
(1) ListView、GridView高度設定為match_parent
(3) 可使用support-v7包下的RecyclerView代替ListView和GridView,它本身已經做好了對view的回收和複用,並且可以輕鬆實現列表項水平排列、瀑布流、插入刪除item時的動畫效果等。