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