android复杂列表滑动卡顿,Android 列表滑动性能优化总结
列表滑動性能優(yōu)化是一個老生常談的問題,最近在做項目的時候又遇到了列表滑動卡頓的問題,我在經(jīng)過多次思考和嘗試后,終于找到了滑動卡頓的元兇,于是將經(jīng)驗總結(jié)下來。
ViewHolder
先說說最常規(guī)的ViewHolder。ViewHolder的出現(xiàn)是為了解決在綁定視圖數(shù)據(jù)的時候使用findViewById遍歷視圖樹(以深度優(yōu)先的方式)查找視圖引起耗時操作的問題,將第一次查找到的視圖放入靜態(tài)的ViewHolder中,以后綁定新數(shù)據(jù)時直接從ViewHolder中拿到視圖引用。在ListView中使用ViewHolder是基本的優(yōu)化思路,當(dāng)然最好的是直接使用RecyclerView,它自帶了ViewHolder。(推薦使用MultiType作為RecyclerView的Adapter,這個庫設(shè)計的很優(yōu)美)
數(shù)據(jù)處理
很多時候從我們要對服務(wù)器上獲取下來的列表數(shù)據(jù)進行一次二次加工,以便轉(zhuǎn)化為我們界面上要顯示的數(shù)據(jù),這些操作可能會比較耗時。比如字符串拼接、時間格式化等操作都是比較耗時的操作。比較好的實踐是將列表數(shù)據(jù)的加工在notifyDataSetChanged()之前在后臺線程做好,在Adapter中只做數(shù)據(jù)的綁定。
Item View 的變化
有時候我們會根據(jù)數(shù)據(jù)類型來控制一個View的顯隱,當(dāng)給一個View設(shè)置setVisibility(View.GONE)的時候,會觸發(fā)布局的重新測量、布局、繪制等操作,若itemView的布局比較復(fù)雜,重新測量繪制會很耗時間,引起列表卡頓。這個時候可以將數(shù)據(jù)和itemView分解成不同的類型,根據(jù)類型來綁定對應(yīng)的itemView,減少布局的重繪操作。
重用OnClickListener
通常我們?yōu)锽utton設(shè)置點擊事件的時候都是直接創(chuàng)建一個匿名內(nèi)部類的對象(new OnClickListener{}),習(xí)慣了這種綁定事件的方式后我們可能在列表中也這么做。在列表滑動的時候會不停的重復(fù)創(chuàng)建新的OnClickListener的操作,舊的OnClickListener會被標(biāo)記為需要垃圾回收,當(dāng)需要回收的對象過多的時候會引起GC,導(dǎo)致列表卡頓。可以創(chuàng)建一個通用的OnClickListener,把數(shù)據(jù)放入Button的Tag中,根據(jù)id來判斷是哪個Button執(zhí)行了點擊,來取出數(shù)據(jù)、執(zhí)行不同的邏輯。
圖片的異步加載
用Glide、Picasso、Fresco等圖片異步加載框架。
界面優(yōu)化
優(yōu)化布局層級減少過渡繪制、優(yōu)化布局方式提高布局效率。關(guān)于這點官方推薦使用ConstraintLayout,在我目前的實踐中,ConstraintLayout作為RecyclerView的Item布局的時候可能會有卡頓現(xiàn)象(主要是布局重繪引起的)。
總結(jié)
以上是生活随笔為你收集整理的android复杂列表滑动卡顿,Android 列表滑动性能优化总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据 深度 分页_机器学习、深度学习、
- 下一篇: android 应用无法安装程序,朋友a