0

私は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); 
     } 
    } 
} 

+0

ViewPagerは、ユーザーがスワイプしたときに隣接する2つのページを表示する必要があるため、表示される前に隣接するページを作成します。ビューは実際には必要ですが、オフスクリーンであるにもかかわらず、必要です。現在のページに隣接していないページは作成されず、破棄されます。 – dsh

+0

何らかの理由で、 'setOffscreenPageLimit'を何に設定しても、ViewPagerは常に6ページを読み込みます。私の以前の解決策は、 'RecyclerView'を' ViewStub'sに入れて、中央のページがスクロールされたときに隣接するページを膨らませることでした。それは実際にはかなりうまくいくが、私はこれより少し速くできると思った。 – NewEndian

+0

興味深い。私が働いているアプリには3つのタブを持つViewPagerが1つあります。私はsetOffscreenPageLimitメソッドを認識していませんでしたが、現在のタブと隣接するタブが存在し、タブが変更されたときに他のタブが存在しないことを確認しました。 (私は最近、自分のカスタムビューにprintステートメントを入れて、それを見たり/デバッグしたりしていましたが、これはウィンドウから切り離されたときの状態を示していますが、フラグメントのライフサイクルで、 ) – dsh

答えて

0

だから、ここで私が述べたように動作LinearLayoutManagerのサブクラスです。 dshが言及しているように、隣接するページを画面に表示することが重要です(実際には、setOffscreenPageLimitがロードされたページ数を期待通りに制限しない理由はわかりません)。私の以前の解決策は、ViewStubを使用し、ページが画面上にあるか隣接しているときにのみページを膨張させることでした。レイアウトマネージャの方法は、最初にアンロードされたページを回転させると少し速くなりますが、ViewStubは一旦ロードされるとメモリに保持されるというメリットがあります(後続のスクロールがスムーズになります)。

ありがとうございます。次の質問...

関連する問題