因此,这是一个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
具有页面在加载后保留在内存中的优点(使后续滚动更流畅),所以我决定坚持下去。
谢谢你们。下一个问题...