所以這裏的LinearLayoutManager
一個子類,經營我所描述的方法:
public class PageVisibleLinearLayoutManager extends LinearLayoutManager {
public PageVisibleLinearLayoutManager(Context context) {
super(context);
}
public PageVisibleLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public PageVisibleLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
private boolean pageVisible = true;
void setPageVisible(boolean pageVisible) {
boolean change = (this.pageVisible != pageVisible);
this.pageVisible = pageVisible;
if(change) requestLayout();
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
if(pageVisible) {
super.onLayoutChildren(recycler, state);
} else {
removeAndRecycleAllViews(recycler);
}
}
}
它可以很好地,如果要求放棄自己的觀點。正如dsh提到的,將相鄰頁面標記爲屏幕非常重要(我真的不知道爲什麼setOffscreenPageLimit
不會按預期方式限制加載的頁面數量)。我以前的解決方案是使用ViewStub
,並且只有在屏幕上或相鄰時纔對頁面進行充氣。初始轉向空載頁面時,佈局管理器方法稍快,但ViewStub
的優點是頁面一旦加載(使後續滾動更順暢),頁面將停留在內存中,因此我決定堅持這一點。
謝謝大家。下一個問題...
ViewPager在可見頁面之前創建相鄰頁面,因爲用戶在它們之間滑動時需要顯示兩個相鄰頁面。所以,這些觀點確實是必需的,儘管他們一度不在屏幕之外。不與當前頁面相鄰的頁面不會被創建並被銷燬。 – dsh
出於某種原因,無論我設置了「setOffscreenPageLimit」,ViewPager總是加載6個頁面。我之前的解決方案是將'RecyclerView'放入'ViewStub'中,並在中心頁面滾動時爲相鄰頁面充氣。實際上這很有效,但我想也許我可以多一點速度。 – NewEndian
有趣。我正在使用的應用程序具有一個帶3個選項卡的ViewPager。我並不知道setOffscreenPageLimit方法,但我確實觀察到當前和相鄰的選項卡存在,而另一個選項卡不會更改。 (我最近在自定義視圖中有打印語句來觀察/調試它的生命週期;這就是我知道它何時從窗口分離出來的過程;在我們處理它們的過程中,我們在碎片的生命週期中曾經有過調試打印) – dsh