ViewPager 페이지를 변경하는 방법?


150

내 앱에서 ViewPager를 사용하고 기본 활동에서 정의합니다. 내부 onCreate방법에서는 SharedPreferences에서 몇 페이지를로드 한 다음 PagerAdapter에 전달합니다.

@Override
public int getCount() {
    return numberOfPages;
}

문제는 환경 설정 (또는 다른 활동) 에서이 숫자를 이전에 본 페이지 색인보다 적은 다른 것으로 변경하면이 ViewPager로 활동으로 돌아갈 때이 색인이 범위를 벗어 났기 때문에 앱이 충돌한다는 것입니다. 활성 ViewPager 페이지를 변경하여 간단하게 수정할 수 있습니다. 그것을 할 수있는 방법이 있습니까?

답변:


394

나는 그 질문을 완전히 이해하고 있는지 확신 할 수 없지만, 당신의 질문의 제목에서, 당신이 찾고있는 것이 pager.setCurrentItem( num )입니다. 그러면 프로그램 내에서 다른 페이지로 프로그래밍 방식으로 전환 할 수 있습니다 ViewPager.

이것이 문제가 아닌 경우 logcat의 스택 추적이 더 구체적이어야합니다.


3
그렇습니다. 정확히 내가 필요한 것입니다. 나는로 설정 0onPause방법과 어떤 충돌이 없습니다. 감사.
로마

1
실제로 ViewPager에 대한 문서는 매우 적습니다. +1입니다.
Arnab Chakraborty

1
만약 부하 호출기 걸릴 많은 시간이 있기 때문에 현재의 위치에서 기본보기 호출기 부하 +1과 -1 페이지에서, setOffscreenPageLimit (1)를 사용할 수있는 것보다 페이지
아제 디야

이것은 작동하지 않습니다. 단편이 이미 추가되었다는 오류가 발생합니다.
BlondeSwan

24

오른쪽으로 슬라이드

viewPager.arrowScroll (View.FOCUS_RIGHT);

왼쪽으로 슬라이드

viewPager.arrowScroll (View.FOCUS_LEFT);


짧고 깨끗합니다!
dakshbhatt21

1
나는 이것이 이것이 받아 들여지는 대답이어야한다고 거의 믿는다. 현재 항목을 설정하는 것보다 훨씬 실용적입니다.
Peter

18

귀하의 코드를 확인하지 않고 귀하의 설명은 페이지가 동기화되지 않았으며 오래된 데이터가 있다고 생각합니다.

페이지 수를 변경하고 이전 페이지 세트에 액세스하고 있기 때문에 충돌한다고 말합니다. 니가 전화하지 않는 것처럼 들리네pageAdapter.notifyDataSetChanged()데이터를 변경 한 후 .

귀하의 경우에는 viewPager10 페이지 세트의 3 페이지를 보여주고있다, 당신은 다음 전화 만 5 세트로 변경 notifyDataSetChanged(), 당신이 찾을 수 있습니다하면 이제 새로운 세트의 3 페이지를보고있는 것입니다. 이전 세트의 8 페이지를 이전에보고 있었다면 새 세트를 넣고 전화 notifyDataSetChanged()를 한 후에 충돌없이 새 세트의 마지막 페이지를 볼 수 있습니다.

현재 페이지 만 변경하면 문제를 숨길 수 있습니다.


1
notifyDataSetChanged ()의 경우 1 더하기
madhu527

@Richard 당신은 내 하루 친구를 저장합니다. notifyDataSetChanged()
알리

15

다른 페이지로 전환하려면 다음 코드로 시도하십시오.

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

1
완전한! postDelay 메소드없이 사용하려고 시도했지만 작동하지 않았습니다. 왜이 방법으로 작동하는지 알고 있습니까? 감사! :)
Georgi Koemdzhiev 2012 년

같은 질문 ... 왜이 지연으로 항목이 변경됩니까?
Kalyan Raghu

@GeorgiKoemdzhiev 전화를 걸 때 아직보기가 완료되지 않았기 때문에viewPager.setCurrentItem
Zohab Ali

3

보충 답변

익명의 내부 클래스를 만들었 ViewPager으므로 변수를 선언 addOnTabSelectedListener해야 했기 때문에 원래 다른 클래스 메서드에서 참조를 얻는 데 문제가있었습니다 . 해결책은 클래스 멤버 변수를 사용하고 익명의 내부 클래스를 사용하지 않는 것입니다.ViewPagerfinal

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        // don't use an anonymous inner class here
        tabLayout.addOnTabSelectedListener(tabListener);

    }

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    };

    // The view pager can now be accessed here, too.
    public void someMethod() {
        viewPager.setCurrentItem(0);
    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.