1. 程式人生 > >平板以及小運存手機APP使用RecyclerView卡頓解決方案

平板以及小運存手機APP使用RecyclerView卡頓解決方案

前言

最近一直在做平板類應用的開發,關於自動售貨機的系統,我也是第一次接觸硬體以及Android盒子的開發,從剛開始的陌生到現在的熟悉,感覺還是收穫挺多的,最近專案快要上線了,介面真的很簡單,展示商品用的只是RecyclerView,也沒有巢狀,但是就是滑動卡頓不流暢,後來發現了幾個不常用的方法,跟大家分享下~~

RecyclerView的前期的優化方案:

剛開始發現問題以為是優化item佈局,滑動時不載入圖片,使用glide載入圖片時不進行記憶體快取,載入縮圖,載入圖片進行壓縮等方案。
Glide.with(context)
                .load(url)
                .diskCacheStrategy(DiskCacheStrategy.RESULT)
                .skipMemoryCache(true) //不進行記憶體快取
                .thumbnail(0.3f) //載入縮圖
                .override(150, 150) //對圖片進行壓縮
                .placeholder(R.drawable.icon_goodsdefault)
                .crossFade()
                .into(imageview);

上面是Glide的優化,說是優化其實只是使用方式,這個都檢查之後,效果還是有的,但是收效甚微,於是就去另尋方法,終於找到了最終的破解之法:

重點:

recyclerview.setHasFixedSize(true);

如果所有的 Item 的高度固定大小,使用上述程式碼這樣可以減少測量次數,尤其是對於 GridLayoutManager。

recyclerview.setItemViewCacheSize(10);
recyclerview.setDrawingCacheEnabled(true);
recyclerview.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

然後RecyclerView可以設定自己所需要的ViewHolder數量,並且設定draw快取。 通過上邊的兩步已經大大改善了滑動的情況,但是我的資料需要根據分類進行notifyDataSetChanged(),然後把這個也優化了一下:

mAdapter.setHasStableIds(true)

使用上述程式碼的話,Adapter中的getItemId要重寫成如下,否則資料重新整理會出錯。

	@Override
    public long getItemId(int position) {
        return position;
    }

小結

在平時手機開發中,基本沒有進行過這麼深度的優化,但是我的android盒子運存只有1G,在繪製的時候肯定比手機差的太多,這裡寫出來給大家分享下,有問題的同學可以私信我或者QQ都可以~~

一個android小菜鳥,寫了一篇小總結,祝大家工作順利~~~