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的优点是页面一旦加载(使后续滚动更顺畅),页面将停留在内存中,因此我决定坚持这一点。

谢谢大家。下一个问题...

相关问题