0

각 페이지마다 RecyclerView을 사용하고 페이지 전체에 ViewItem 행을 공유하는 ViewPager이 있습니다. 따라서 저는 그들 사이에 하나의 RecyclerViewPool을 공유합니다. 그러나 ViewPager은 각 페이지가 화면에 있는지 여부에 상관없이 각각 RecyclerView을로드합니다. RecyclerView에 모든 항목이 화면에 나타나지 않고보기가 강제로 Recycler으로 반환되도록 지시하는 방법이 있습니까?Android RecyclerView plus 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는 인접 페이지가 표시되기 전에 인접 페이지를 사용자가 스 와이프 할 때 표시해야하기 때문에 인접 페이지를 표시합니다. 따라서 시각은 실제로는 오프 스크린입니다. 현재 페이지에 인접하지 않은 페이지는 작성되지 않고 파기됩니다. – dsh

+0

어떤 이유에서든'setOffscreenPageLimit'을 설정 한 것과 관계없이 ViewPager는 항상 6 페이지를로드합니다. 필자의 이전 솔루션은'RecyclerView'를'ViewStub's에 넣고 중앙 페이지가 스크롤 될 때 인접 페이지를 팽창시키는 것이 었습니다. 사실 꽤 잘 작동하지만, 아마도 이것보다 조금 더 빠르다. – NewEndian

+0

흥미 롭습니다. 내가 작업하고있는 앱에는 3 개의 탭이있는 ViewPager가 하나 있습니다. setOffscreenPageLimit 메서드를 알지 못했지만 현재 탭과 인접 탭이 존재하고 다른 탭이 변경된 것을 관찰했습니다. (필자는 최근에 커스텀 뷰에서 커스텀 뷰의 print 문을 사용하여 라이프 사이클을 감시/디버깅했는데, 이는 창에서 분리 된 시점을 알 수있는 방식으로, 조각 작업의 일부로 디버그 지문을 사용했습니다.) – dsh

답변

0

그래서 여기에 내가 설명하는 방법을 운영 LinearLayoutManager의 서브 클래스입니다. dsh가 언급했듯이 인접한 페이지를 화면에 표시하는 것이 중요합니다 (그리고 실제로 setOffscreenPageLimit이 예상대로로드 된 페이지의 수를 제한하지 않는 이유를 알지 못합니다). 이전의 해결책은 ViewStub을 사용하여 페이지가 화면이나 인접한 경우에만 페이지를 부 풀리는 것입니다. 레이아웃 관리자 방법은 언로드 된 페이지로 처음 전환 할 때 약간 더 빠릅니다. 그러나 ViewStub은 일단로드되면 메모리에 남아있는 페이지의 이점을 가지므로 (이후의 스크롤을보다 부드럽게 만듭니다), 그래서 나는 그것에 충실하기로했습니다.

감사합니다. 다음 질문 ...