0

我有一個ViewPager,它爲每個頁面使用RecyclerView,並跨頁共享ViewItem行。因此,我共享他們之間的單一RecyclerViewPool。但是,ViewPager會加載每個RecyclerView,而不管它是否爲屏幕上的頁面。有沒有辦法向RecyclerView表明它的所有物品都在屏幕外並強制其視圖返回到RecyclerAndroid RecyclerView plus ViewPager

我的感覺是,子類LinearLayoutManager和覆蓋其onLayoutChildren方法是要走的路,但我沒有太多的經驗與LayoutManager並希望一些指導。

+0

ViewPager在可見頁面之前創建相鄰頁面,因爲用戶在它們之間滑動時需要顯示兩個相鄰頁面。所以,這些觀點確實是必需的,儘管他們一度不在屏幕之外。不與當前頁面相鄰的頁面不會被創建並被銷燬。 – dsh

+0

出於某種原因,無論我設置了「setOffscreenPageLimit」,ViewPager總是加載6個頁面。我之前的解決方案是將'RecyclerView'放入'ViewStub'中,並在中心頁面滾動時爲相鄰頁面充氣。實際上這很有效,但我想也許我可以多一點速度。 – NewEndian

+0

有趣。我正在使用的應用程序具有一個帶3個選項卡的ViewPager。我並不知道setOffscreenPageLimit方法,但我確實觀察到當前和相鄰的選項卡存在,而另一個選項卡不會更改。 (我最近在自定義視圖中有打印語句來觀察/調試它的生命週期;這就是我知道它何時從窗口分離出來的過程;在我們處理它們的過程中,我們在碎片的生命週期中曾經有過調試打印) – dsh

回答

0

所以這裏的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的優點是頁面一旦加載(使後續滾動更順暢),頁面將停留在內存中,因此我決定堅持這一點。

謝謝大家。下一個問題...

相關問題