1. 程式人生 > >Android recycleView 的一北京PK10平臺出租些優化與相關問題

Android recycleView 的一北京PK10平臺出租些優化與相關問題

prot inflate 更多 額外 特性 contex grid protect apt

北京PK10平臺出租論壇:haozbbs.com Q1446595067

recycleView 也出來很長時間了,記錄一些自己見到的recycleView優化吧。

1.recyclerView.setHasFixedSize(true);

Item的高度是固定的,設置這個選項可以提高性能.總得來說就是就是避免整個布局繪制。就是避免requestLayout.

具體的可以看看stackoverflow的這個幾個問題

Understanding RecyclerView setHasFixedSize

When do we use the recyclerView.setHasFixedSize?

設置這個可以避免重復的增刪造成而外的浪費資源

看完就差不多了
2.復用RecycledViewPool

總而言之
如果RecycledView的adapter是一樣的話可以考慮共享一個對象池。
比如說:
RecycledView嵌套RecycledView,裏面的RecycledView大部分都adapter都一樣。
轉自圖片

註意
如果 LayoutManager是LinearLayoutManager或其子類(如GridLayoutManager)
需要手動開啟這個特性:layout.setRecycleChildrenOnDetach(true)

例如:

class OuterAdapter extends RecyclerView.Adapter<OuterAdapter.ViewHolder> {

RecyclerView.RecycledViewPool mSharedPool = new RecyclerView.RecycledViewPool();

...

@Override

public void onCreateViewHolder(ViewGroup parent, int viewType) {

RecyclerView view = new RecyclerView(inflater.getContext());

 LinearLayoutManager innerLLM = new LinearLayoutManager(parent.getContext(), LinearLayoutManager.HORIZONTAL);
    innerLLM.setRecycleChildrenOnDetach(true);
    innerRv.setLayoutManager(innerLLM);
    innerRv.setRecycledViewPool(mSharedPool);
    return new OuterAdapter.ViewHolder(innerRv);
}
...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

3.橫向嵌套RecyclerView滑動數據預加載,setInitialItemPrefetchCount

註意只適合橫向嵌套
這裏寫圖片描述
在內部的 LayoutManager 中調用 LinearLayoutManager 的setInitialItemPrefetchCount()方法(25.1版本起可用)

innerLLM.setInitialItemsPrefetchCount(num);

num值看自己列表定把。不是越大越好。比如列表展示剛剛展示四個半item。就設置5.以此類推吧

想了解具體的可以看看這篇文章
RecyclerView 數據預取
4.RecyclerView 預加載,getExtraLayoutSpace

一開始我做這個漫畫預覽界面的時候就要用到提前加載圖片。上面那個嵌套的不管用,這裏要吐槽一下百度,-v-!mmp這搜索都是一樣的答案!!!!!!.最後還是在stack overflow上才找到方案。

只要增加預留的額外空間,就是改變滑動時預判的範圍就可以了。

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this) {@Override
br/>@Override
return 300;
}
};

1
2
3
4
5
6

具體的可以看看這兩個
How to load all the images in the background of a RecyclerView in Android

使用getExtraLayoutSpace為LayoutManager設置更多的預留空間
5.特殊點的優化

如果你覺得你的內存還ok,也就是要RecyclerViews有個流暢的體驗。可以考慮設置下面的幾點

binding.fragmentCandidateBrowseList.setItemViewCacheSize(30);
binding.fragmentCandidateBrowseList.setDrawingCacheEnabled(true);
binding.fragmentCandidateBrowseList.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

1
2
3

這裏寫圖片描述

來自於下面這篇文章,就是如何達到60fps。裏面一些優化也可以看看
RecyclerView Tips: How we achieved 60 FPS in Workable’s Android Recruiting App
6.RecycleView與NestedScrollView的嵌套

這是一個大坑,嵌套之後會發生一些奇奇怪怪的問題。

比如莫名的在中間顯示(焦點被搶)
RecycleView滑動會感覺到卡頓,可以通過mRecyclerView.setNestedScrollingEnabled(false);解決這個問題
一次性加載所有item,而不是加載當前可見的Item,如果你的item布局夠復雜或者條目很多,卡頓會很嚴重
相關屬性會失效,例如 linearManager.findLastVisibleItemPosition();獲取當前第一個可見的position等…

相關問題鏈接與對應的解決方案:

Recycler view inside NestedScrollView causes scroll to start in the middle
Recyclerview inside Nested Scrollview scroll but does not fast scroll like normal Recyclerview or Nested Scrollview

3,和4.的話我是就沒辦法解決了,看了stackoverflow上的回答,就是最好別用嵌套。
這裏寫圖片描述
 
7.RecycleView復雜布局相關建議

剛剛上面有說道,盡量少用嵌套,可以避免很多不必要的坑。如果布局復雜呢?一定要用到嵌套呢?

比如這個b站的這個直播布局
這裏寫圖片描述

比較常見的布局上優化

減少布局的嵌套,減少布局層次關系
<include>,<merge>,<ViewStub>等標簽

多類型,多布局
按照平常的思維,編寫上面的布局,一般情況是這樣子的。
這裏寫圖片描述
這樣做是Ok的,但是隨著業務的增長,東西都堆積在一個 Adapter,所以會變得繁瑣,不好維護。

我一般是通過這種多布局的方式去處理,把不用的業務分發到不同的viewHolder.

所以我這邊推薦我自認為還是ok的框架,小,且強大。

—>>MultiType
—>>Android 復雜的多類型列表視圖新寫法

Android recycleView 的一北京PK10平臺出租些優化與相關問題