4

FragmentPagerAdapter의 무한 확장자를 만들었습니다 (this site에서이를 수행하는 방법에 대한 예제가 있음). 이렇게하면 52 개의 조각 (매주 한 번)을 50 개 (임의의 숫자) 반복하여 사용자에게 무한한 조각 느낌을 줄 수 있습니다.ViewPager.setCurrentItem은 smoothScroll이 true로 설정된 경우에만 작동합니다.

스크롤 할 때/ViewPager.setCurrentItem를 호출하여 조각 사이에 점프, 내가 보는 두 가지 시나리오가 있습니다 :

  1. 하나 개의 조각 중 하나의 방법을 점프 - 모든 괜찮습니다. 이는 아마도 에서이 사용 사례를 전문으로하는 코드 때문일 것입니다 (We are doing a jump by more than one page으로 시작하는 주석 찾기)
  2. 두 개 이상의 조각으로 건너 뛰면 setCurrentItem이 호출 될 때만 새 조각이 화면에 올바르게 표시됩니다 smoothScrolltrue (즉, setCurrentItem(i, true))으로 설정된 경우.

    if (smoothScroll) { 
        smoothScrollTo(destX, 0, velocity); 
        if (dispatchSelected) { 
         dispatchOnPageSelected(item); 
        } 
    } else { 
        if (dispatchSelected) { 
         dispatchOnPageSelected(item); 
        } 
        completeScroll(false); 
        scrollTo(destX, 0); 
        pageScrolled(destX); 
    } 
    

    이것은 내가 깊이에서 오전 지점입니다 : 그렇지 않으면 내가 무엇을 볼 수에서 빈 화면

ViewPager.scrollToItem가에 다음 코드를 가지고 있기 때문에, 이것은 아마도입니다. 왜 이것이 if/else이 내가 겪고있는 현상을 일으키는가?

+0

첫 번째로 보게 될 것은'FragmentPagerAdapter # getItem()'이 적절한 위치에서 제대로 호출되고 있는지입니다. 어떤 이유로 든 조각을 적절히로드하지 않는 것 같습니다. 어쩌면 두 번이라고 불리는 것을보아야합니다. 선택한 위치에 한 번, 한 번, 한 번. – DeeV

+0

@Deev,이 아이디어를 테스트하기 위해 logcat에 항목을 추가했습니다. 결과는 pastie.org/private/ybvvn5rwl1465haic6fvq에서 확인할 수 있습니다. 'getItem'은'setCurrentItem (i, false)'(설명 할 수없는 상황)이 발생했을 때 3 번 호출됩니다. 로그에는'getItem (1327)', 아직'newInstance (27)'가 있습니다. 이것은 "무한한"뷰어 때문입니다. - 1327 % 52 = 27 – levengli

+0

@levengi 그때 무슨 문제인지 잘 모르겠습니다. 예가 부드러운 스크롤이 가능하다는 가정하에 나온 것처럼 보입니다. – DeeV

답변

2

설명은 매우 간단합니다. ViewPager은 모든 조각 상태를 유지하지 않으므로 모든 상태를 계속 유지하는 것이 성능에 좋지 않을 수 있습니다.

이 경우 정확하게 setOffscreenPageLimit 메서드가 있습니다. 그 목적은 ViewPager이 현재와 왼쪽에서 오른쪽으로 유지해야하는 조각의 상태 수를 정의하는 것입니다. 더 자세한 배경 조사 공식 문서는 https://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

유휴 상태의보기 계층 구조에서 현재 페이지의 어느 쪽에나 유지해야하는 페이지 수를 설정합니다. 이 제한을 초과하는 페이지는 필요한 경우 어댑터에서 다시 작성됩니다.

이것은 최적화를 위해 제공됩니다. 페이지에서 페이지를 지원하거나 지연로드 메커니즘이 필요한 페이지의 수를 미리 알고 있다면이 설정을 조정하면 페이징 애니메이션과 상호 작용이 부드럽게 느껴질 수 있습니다. 한 번에 모든 페이지를 활성 상태로 유지할 수있는 페이지 수가 적 으면 (3 ~ 4) 사용자 페이지를 앞뒤로 이동하면서 새로 만든보기 하위 트리의 레이아웃에 소요되는 시간이 줄어 듭니다.

페이지가 복잡한 레이아웃 인 경우 특히이 한도를 낮게 유지해야합니다. 우리가 기본 제한을 볼 수 있도록로 1

이 설정의 기본값은 1이다 - 즉 하나의 조각을 점프하는 것은 완벽하게 작동 왜 대답입니다. 또한 부드러운 스크롤의 경우에 대한 대답이기도합니다. 부드러운 스크롤을 사용하여 새 항목을 설정하려는 경우 조각 하나 하나를 스크롤해야한다는 것을 의미합니다. 기본 제한 1이 작동하는 경우입니다.

따라서 귀하는 setOffscreenPageLimit(52)으로 시도한 다음 setCurrentItem(50)을 예상대로 사용할 수 있습니다. 을 권장하지 않습니다. 동작을 확인하기 만하면됩니다.네트워크에서 일부 데이터를로드하는 것과 같이 조각에서 어려운 작업을 수행하는 경우 시작시 큰 지연이 발생하여 모든 조각이 한꺼번에로드됩니다.

희망 하시겠습니까?

+0

은 매력처럼 작동했습니다. 감사합니다 – levengli

+0

당신을 환영합니다! – rom4ek

관련 문제