所以这里的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