ViewPagerの現在位置を取得する


84

ギャラリーウィジェットでgetSelectedItemPosition()を使用できたことを知っています。現在の位置を取得しますが、ViewPagerにはそれがないようです。

リスナーを設定して、ページが切り替わったときに位置を取得できることはわかっています。しかし、現在のビュー位置が必要です。

回答:


94

リスナーを作成し、ビューページャーに設定します。

/**
 * Get the current view position from the ViewPager by
 * extending SimpleOnPageChangeListener class and adding your method
 */
public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}

4
これを使用するときは注意してください。ビューが変更されていない場合、getCurrentPage()は常に0を返します。何らかの理由で、最初のビュー以外のビューにViewPagerを入力した場合、期待する値は0であってはなりません...最初のビューに常に入力したわけではないため、これで問題が発生しました。見る。
ブランドンロマーノ2013年

1
@Adamは、この関数の呼び出し方法を教えてくださいgetCurrentPage
user3233280 2014年

とても簡単です。androiduに感謝します。
whdals0 2018年


4

2019年更新

これでaddOnPageChangeListener、[ページの表示]で[ページの位置の変化を監視する]を設定できます 。

リスナーを設定して、ページが切り替わったときに位置を取得したかったので

mViewPager.addOnPageChangeListener(object : OnPageChangeListener {
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

            override fun onPageSelected(position: Int) {
                pagePosition.setText("" + position + "/" + galleryAdapter!!.count)
            }
        })

-1

私は今あなたにそれがハックだと言っているので、その理由で反対票を投じる理由はありません。つまり、それはあなたにとって特に役立つかどうかのどちらかです。いずれにせよ、以下の説明はいくつかの洞察を提供し、コミュニティに役立ちます。また、このソリューションは、を持たない古いAPIに適していますViewPager.getCurrentItem()


まず、ちょっとした情報。ViewPagerのすべての子を繰り返し処理しViewPager.getChildAt(x);、各子ビュー(ページ)でtoString()(またはgetLeft())印刷してから、ページを変更するたびにこれを行うと、子が表示される論理的な順序になっていないことに気付くでしょう。ページに戻り始めたとき(最初に戻ってページング)。どうやら、それは配列から不要な子を削除し、次に最新の子を配列に追加します。したがって、たとえば、2ページを見てから3ページに変更したとすると、子のリストはこの順序page 2, page 3, page 4ViewPager.getChildAt(1);なり、現在のページが返されます。ただし、その後(3ページから)2ページに戻ると、子のリストはこの順序になります。page 2, page 3, page 1。つまり、ViewPager.getChildAt(1);現在のページを返しません。この情報を使用して現在のページを取り除くための簡単なロジックをまだ見つけることができていません。後ろの配列内のページの順序はgetChildAt、ユーザーがページングしている方法に基づいて任意の順序になっているためです。

そうは言っても、私はハッキングの回避策を開発しました。この機能がすべての環境で機能するかどうかはわかりませんが、現在のプロジェクトでは機能します。あなたに合わないのなら、それは異なるAPIレベルの問題だと思います。しかし、私は実際には他の環境の問題を疑っていません。

さて、肉の上に。私が気付いたのは、の結果がViewPager.getChildAt(x).getLeft()親に対してある種の水平ピクセル座標を持つことでした。そこで、この情報を使用して、現在のビューがどれであるかを除外しました。

private int getCurrentPageIndex(ViewPager vp){
    int first,second,id1,id2,left;
    id1 = first = second = 99999999;
    View v;
    for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
        left = vp.getChildAt(i).getLeft();
        if ( left < second ) {
            if ( left < first ) {
                second = first;
                id2 = id1;
                first = left;
                id1 = i;
            } else {
                second = left;
                id2 = i;
            }
        }
    }
    return id2;
}

この関数は、getLeft()すべてを理解するためにの値に依存しているため、おそらく疑わしいハックです。しかし、私はそれぞれの子供の左の座標をつかみます。次に、これを他の値と比較し、最初と2番目のページを格納して、関数から2番目のページ(現在のページ)を返します。綺麗に動いているようです。

なぜ(あなたが尋ねるかもしれませんが)私はただ使用しなかったのonClickListenterですか?まあ、私は、リスナー、他のクラス、決定的でない焦点、および他の肥大化を含める必要なしにこれを行うための簡単な方法があると思い切って決心しました。残念ながら、このソリューションは正確に単純ではありません。しかし、それは膨張、他のクラスとリスナーを排除します。もっと簡単な方法がわかれば、この関数を書き直します。あるいは、これは他の誰かがひらめきを持つための洞察を提供するでしょう。


1
あなたは私を救いました!いくつかの恐ろしいバグがありました。何が悪かったのか見つけることができませんでした。あなた、サー、何億もの賛成に値する!
ヌルスルタンタラプベコフ2015年

ありがとうございます!コミュニティはあなたの熱意を共有していないと思います。
Pimp Trizkit 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.