ViewPagerのページを変更するには?


150

アプリでViewPagerを使用しており、メインアクティビティで定義します。Inside onCreateメソッドでは、SharedPreferencesからいくつかのページをロードしてから、PagerAdapterに渡します。

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

問題は、設定(または別のアクティビティ)でこの数を以前に表示したページインデックスよりも小さい値に変更すると、このViewPagerでアクティビティに戻ったときにこのインデックスが範囲外であるため、アプリがクラッシュすることです。アクティブなViewPagerのページを変更するだけで修正できます。それを行う方法はありますか?

回答:


394

質問を完全に理解したかどうかはわかりませんが、質問のタイトルから、探しているのはだと思いますpager.setCurrentItem( num )。これにより、内の別のページにプログラムで切り替えることができますViewPager

これが問題でない場合は、logcatからのスタックトレースを確認して、より具体的にする必要があります。


3
はい、まさにそれが必要です。私はそれをメソッドに設定し0onPauseクラッシュはありません。ありがとう。
ローマ

1
実際、ViewPagerに関するドキュメントは非常に少なくなっています。+1。
Arnab Chakraborty、2011

1
ページャーのロードにsetOffscreenPageLimit(1)を使用するよりも時間がかかる場合、デフォルトでは現在の位置からページャーロード+1および-1ページが表示されるため
Ajay Pandya

これは機能しません。フラグメントがすでに追加されているというエラーが表示されます。
BlondeSwan

24

右にスライド

viewPager.arrowScroll(View.FOCUS_RIGHT);

左にスライド

viewPager.arrowScroll(View.FOCUS_LEFT);


短くてきれい!
dakshbhatt21 2017

1
私はこれが受け入れられる答えであるべきだとほぼ信じています。現在のアイテムを設定するよりもはるかに実用的です。
ピーター

18

あなたのコードをチェックせずに、あなたが説明しているのは、ページが同期しておらず、古いデータがあることです。

ページ数を変更していて、古いページセットにアクセスしているためにクラッシュするとします。これはpageAdapter.notifyDataSetChanged()、データを変更した後に電話をかけていないように聞こえます。

あなたの場合はviewPager10ページのセットの3ページを示している、とあなたが呼び出して、わずか5とセットに変更notifyDataSetChanged()、何を見つけることは、あなたが今、新しいセットの3ページを見ているです。以前に古いセットのページ8を表示していた場合、新しいセットを入力して呼び出した後、notifyDataSetChanged()クラッシュすることなく新しいセットの最後のページを表示していることがわかります。

単に現在のページを変更するだけであれば、問題を隠しているだけかもしれません。


1
さらに、notifyDataSetChanged()の1
madhu527

@リチャードあなたは私の日仲間を保存します。10000以上notifyDataSetChanged()
アリ

15

別のページに切り替えるには、次のコードを試してください:

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

1
パーフェクト!postDelayメソッドなしで使用しようとしましたが、機能しませんでした。それがこの方法で機能する理由を知っていますか?ありがとう!:)
Georgi Koemdzhiev 2017年

同じ質問...なぜこの遅延でアイテムが変更され、それ以外の場合は変更されないのですか?
Kalyan Raghu

@GeorgiKoemdzhiev電話をかけたとき、まだビューが終了していないためviewPager.setCurrentItem
Zohab Ali

3

補足回答

元々ViewPagerは他のクラスメソッドからへの参照を取得するのに問題がありました。これは、addOnTabSelectedListenerによって匿名の内部クラスが作成されたため、ViewPager変数を宣言する必要があったためですfinal。解決策は、クラスメンバー変数を使用し、匿名の内部クラスを使用しないことでした。

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.