私はRecyclerView
を各ページに使用し、ViewItem
個のページを共有するViewPager
を持っています。したがって、私はそれらの間に単一のRecyclerViewPool
を共有します。ただし、ViewPager
は、画面上のページであるかどうかにかかわらず、それぞれRecyclerView
を読み込みます。 RecyclerViewにそのアイテムのすべてがオフスクリーンであることを示す方法があり、そのビューは強制的にRecycler
に返されますか?Android RecyclerView + ViewPager
私の感覚ではLinearLayoutManager
をサブクラス化し、そのonLayoutChildren
メソッドをオーバーライドすると、移動するための方法であるということですが、私はLayoutManager
で多くの経験を持っていないと、いくつかの指導をしたいと思います。それがうまく動作し、要求された場合にはその意見をあきらめ
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);
}
}
}
:
ViewPagerは、ユーザーがスワイプしたときに隣接する2つのページを表示する必要があるため、表示される前に隣接するページを作成します。ビューは実際には必要ですが、オフスクリーンであるにもかかわらず、必要です。現在のページに隣接していないページは作成されず、破棄されます。 – dsh
何らかの理由で、 'setOffscreenPageLimit'を何に設定しても、ViewPagerは常に6ページを読み込みます。私の以前の解決策は、 'RecyclerView'を' ViewStub'sに入れて、中央のページがスクロールされたときに隣接するページを膨らませることでした。それは実際にはかなりうまくいくが、私はこれより少し速くできると思った。 – NewEndian
興味深い。私が働いているアプリには3つのタブを持つViewPagerが1つあります。私はsetOffscreenPageLimitメソッドを認識していませんでしたが、現在のタブと隣接するタブが存在し、タブが変更されたときに他のタブが存在しないことを確認しました。 (私は最近、自分のカスタムビューにprintステートメントを入れて、それを見たり/デバッグしたりしていましたが、これはウィンドウから切り離されたときの状態を示していますが、フラグメントのライフサイクルで、 ) – dsh