ListView卡頓的原因以及優化政策
- 重用converView: 通過複用converview來減少不必要的view的建立,另外Infalte操作會把xml檔案執行個體化成相應的View執行個體,屬于IO操作,是耗時操作。
- 減少findViewById()操作: 将xml檔案中的元素封裝成viewholder靜态類,通過converview的setTag和getTag方法将view與相應的holder對象綁定在一起,避免不必要的findviewbyid操作
- 避免在 getView 方法中做耗時的操作: 例如加載本地 Image 需要載入記憶體以及解析 Bitmap ,都是比較耗時的操作,如果使用者快速滑動listview,會因為getview邏輯過于複雜耗時而造成滑動卡頓現象。使用者滑動時候不要加載圖檔,待滑動完成再加載,可以使用這個第三方庫glide
- Item的布局層次結構盡量簡單,避免布局太深或者不必要的重繪
- 盡量能保證 Adapter 的 hasStableIds() 傳回 true這樣在 notifyDataSetChanged() 的時候,如果item内容并沒有變化,ListView 将不會重新繪制這個 View,達到優化的目的
- 在一些場景中,ScollView内會包含多個ListView,可以把listview的高度寫死固定下來。由于ScollView在快速滑動過程中需要大量計算每一個listview的高度,阻塞了UI線程導緻卡頓現象出現,如果我們每一個item的高度都是均勻的,可以通過計算把listview的高度确定下來,避免卡頓現象出現
- 使用 RecycleView 代替listview: 每個item内容的變動,listview都需要去調用notifyDataSetChanged來更新全部的item,太浪費性能了。RecycleView可以實作當個item的局部重新整理,并且引入了增加和删除的動态效果,在性能上和定制上都有很大的改善
- ListView 中元素避免半透明: 半透明繪制需要大量乘法計算,在滑動時不停重繪會造成大量的計算,在比較差的機子上會比較卡。 在設計上能不半透明就不不半透明。實在要弄就把在滑動的時候把半透明設定成不透明,滑動完再重新設定成半透明。
- 盡量開啟硬體加速: 硬體加速提升巨大,避免使用一些不支援的函數導緻含淚關閉某個地方的硬體加速。當然這一條不隻是對 ListView。
100) ? false:true" x-data="topBtn" @click="scrolltoTop" x-cloak>