Android RecyclerView 加 ViewPager

Android RecyclerView plus ViewPager

我有一个 ViewPager,它为每个页面使用 RecyclerView 并跨页面共享 ViewItem 行。因此,我在他们之间共享一个 RecyclerViewPool。但是,ViewPager 会加载每个 RecyclerView,无论它是否是屏幕上的页面。有没有办法向 RecyclerView 指示其所有项目都在屏幕外并强制将其视图返回到 Recycler?

我的感觉是子类化 LinearLayoutManager 并覆盖它的 onLayoutChildren 方法是可行的方法,但我对 LayoutManager 没有太多经验,希望得到一些指导。

所以这是 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 的优点是页面在加载后保留在内存中(使后续滚动更流畅),所以我决定坚持使用它。

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