Program Tip

PagerAdapter 시작 위치

programtip 2020. 11. 9. 20:33
반응형

PagerAdapter 시작 위치


내 viewPager를 구현하기 위해 다음 예제를 사용하고 있습니다. http://code.google.com/p/viewpagerexample/issues/list

이 예제의 문제는 시작 위치를 설정하는 방법을 알 수 없다는 것입니다. 기본 시작 위치는 0입니다. 기본적으로 왼쪽 또는 오른쪽에 사용 가능한보기가 있는지 제어 할 수 없습니다.

센터의 현재 위치를 볼 수있는 방법이 있습니까? 더 나은 방법이 있습니까? 원형으로 만들 수 있습니까?


클래스 외부에서 수행되는 위치를 설정하는 방법을 찾았습니다.

 awesomePager = (ViewPager) findViewById(R.id.awesomepager);
 awesomePager.setAdapter(awesomeAdapter);
 awesomePager.setCurrentItem(CurrentPosition);

여기에 맞추고 싶은 아이템의 양을 계산하여 제한 할 수 있습니다.


FragmentStatePagerAdapter가있는 ViewPager를 사용하여 Activity (방향 변경)를 다시 생성하면 Adapter가 Fragments를 다시 사용한다는 것을 알았습니다. 중지하는 방법은 다음과 같습니다.

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    if (viewPager != null) {
        // before screen rotation it's better to detach pagerAdapter from the ViewPager, so
        // pagerAdapter can remove all old fragments, so they're not reused after rotation.
        viewPager.setAdapter(null);
    }
    super.onSaveInstanceState(savedInstanceState);
}

그러나 활동 레크리에이션 후에 ViewPager는 항상 페이지 0을 먼저 열고 setCurrentItem (CurrentPosition); 작동하지 않습니다. 지연 후 페이지가 변경되는 문제 수정 :

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        viewPager.setCurrentItem(newPosition);
    }
}, 100);

마지막 조각으로 시작하기 위해 다음을 수행했습니다.

PagerAdapter pagerAdapter = new PagerAdapter();
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount() - 1);

어댑터를 설정하기 전에 현재 항목을 설정하면 반환되는 첫 번째 항목이 항상 위치 0에있는 항목이되는 문제가 발생했습니다.

다음 사항을 확인하십시오.

awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);

그리고 아닙니다 :

awesomePager.setCurrentItem(CurrentPosition);
awesomePager.setAdapter(awesomeAdapter);

나는 1000보다 큰 크기의 배열을 가지고 있으며 동적 뷰 페이지에서 나는 firstload에 붙어있는 leftswipe에 직면했습니다. 아래 코드는이 문제를 해결하고 부드러운 스크롤을 가져 왔습니다.

@Override
onResume(){
   super.onResume();
   viewPager.setCurrentItem(newPosition);
}

3 개의 조각을 사용하고 있으며 앱을 시작할 때 두 번째 ( 중간 ) 조각이 기본적으로 표시됩니다. onResume 기능을 사용하고 있으며 모두 훌륭하게 작동합니다.

@Override
protected void onResume() {
    super.onResume();
    m_viewPager.setCurrentItem(1);
}

나는 같은 문제가 발생했습니다. ViewPager를 초기화 할 때 표시기 위치는 0이었습니다. 이것은 Pager 내용을 계산하는 양에 따라 달라질 수 있습니다. 나는 아래와 같이 ViewTreeObserver를 사용합니다.

mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        mViewPager.setCurrentItem(newPosition);
        removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener);
    }
};
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);

과,

private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) {
       if (observer == null) return;
       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
               observer.removeGlobalOnLayoutListener(listener);
       } else {
               observer.removeOnGlobalLayoutListener(listener);
       }
} 

이런 식으로 지연 시간 설정에 신경 쓰지 마십시오.


@Override
public Object instantiateItem(ViewGroup container, int position) {
    View currentPage = null;
    switch(position){
        case 0:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)    
            break;
        case 1:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)    
            ///////////// This page will be default ////////////////////
            ((ViewPager)container).setCurrentItem(position);
            ////////////////////////////////////////////////////////////
            break;
        case 2:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)    
            break;
    return currentPage;
}

사용하여 viewPager.setCurrentItem(newPosition);사용자에게 쇼를에 시작 페이지에서 전환 newPosition, 일어나는 것을 방지하고이 보여 newPosition그 출발점 인 것처럼 직접, 내가 추가 한 false이 같은 두 번째 매개 변수의 뭔가 :

int newPosition = pages.size()-1; // Get last page position

viewPager.setCurrentItem(newPosition, false); // 2nd parameter (false) stands for "smoothScroll"

참고 URL : https://stackoverflow.com/questions/11879315/pageradapter-start-position

반응형