0

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

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

4

1 回答 1

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

谢谢你们。下一个问题...

于 2017-02-24T21:08:47.473 回答