プログラムでViewPagerに次のビューを表示する方法は?


107

私はViewPagerを作成し、すべてが正常に機能していますが、ViewPagerの外側に前の次のボタンを配置して、ViewPager内を移動できるようにしたいと考えています。手動でスワイプせずにViewPagerの次のアイテムに移動するにはどうすればよいですか?


39
これは機能しませんviewpager.setCurrentItem(int index); ?
blessenm

確かに、この質問は重複していると思います。
Vaibhav Mishra、2011年

回答:


154

blessenmが答えviewpager.setCurrentItem(int index)たように、行く方法です。


5
残念ながら、ユーザーが手動でスワイプしたときと、setCurrentItemを使用してジャンプしたときの動作は異なります。呼び出しの順序は逆になります。スワイプすると、最初にOnPageChangeListener#onPageSelectedが呼び出され、次にフラグメントでsetUserVisibleHintが呼び出されます。setCurrentItemを使用する場合、最初にフラグメントでsetUserVisibleHintを呼び出してから、OnPageChangeListener#onPageSelectedを呼び出します。これは実際には私の場合の問題です。 。
AgentKnopf 14

@Vaibhavアクティビティの次のビューを表示したい場合
Prabs

@AgentKnopfこの問題の解決策を見つけることができましたか?この奇妙な動作も確認できますが、プログラムで次/前のフラグメントに切り替えると、通常のスワイプの流れを維持する方法が見つかりません。
Gil

@ギル私は恐れていません-現在のビューのプログラムによる変更を削除し、スワイプのみを許可しました。しかし、後で実装を完全に変更したので、この問題をこれ以上追求しませんでした。
AgentKnopf 2017年

107

完全を期すための完全な実装:

public void MoveNext(View view) {
    //it doesn't matter if you're already in the last item
    pager.setCurrentItem(pager.getCurrentItem() + 1);
}

public void MovePrevious(View view) {
    //it doesn't matter if you're already in the first item
    pager.setCurrentItem(pager.getCurrentItem() - 1);
}

必要になるかもしれません。たとえば、変更がクリックによってトリガーされた場合、その(nextBt.getId() == view.id)原因を知るために使用できます
Tomas Wolf

2
@Sagar彼はボタンのクリックリスナーをxmlに設定している可能性があります。その場合、必要がない場合でも、viewパラメータが必要です。
Ashish Tanna

ページスワイプアニメーションが来ない?
Lavekush Agrawal 2016

18

最も簡単な方法は次のとおりです。

nextButton.setOnClickListener { pager.arrowScroll(View.FOCUS_RIGHT) }
prevButton.setOnClickListener { pager.arrowScroll(View.FOCUS_LEFT) }

これはでは機能しないことに注意してくださいViewPager2
マイサー

0

私はそれを修正します。Androidersonです。

  private void MoveNextTopSlideShow(View view)
    {
        if (_viewPager_TopImageSlide.CurrentItem == _viewPager_TopImageSlide.ChildCount)
        {
            if (_viewPager_TopImageSlide.ChildCount > 0)
            {
                _viewPager_TopImageSlide.SetCurrentItem(0,true);
            }
        }
        else
        {
            //it doesn't matter if you're already in the last item
            _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.CurrentItem + 1, true);
        }
    }

    private void MovePreviousTopSlideShow(View view)
    {
        if (_viewPager_TopImageSlide.CurrentItem == 0)
        {
            if (_viewPager_TopImageSlide.ChildCount > 0)
            {
                _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.ChildCount-1, true);
            }
        }
        else
        {
            //it doesn't matter if you're already in the first item
            _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.CurrentItem - 1, true);
        }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.