ギャラリーウィジェットでgetSelectedItemPosition()を使用できたことを知っています。現在の位置を取得しますが、ViewPagerにはそれがないようです。
リスナーを設定して、ページが切り替わったときに位置を取得できることはわかっています。しかし、現在のビュー位置が必要です。
回答:
リスナーを作成し、ビューページャーに設定します。
/**
* 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;
}
}
次を使用できます。
mViewPager.getCurrentItem()
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)
}
})
私は今あなたにそれがハックだと言っているので、その理由で反対票を投じる理由はありません。つまり、それはあなたにとって特に役立つかどうかのどちらかです。いずれにせよ、以下の説明はいくつかの洞察を提供し、コミュニティに役立ちます。また、このソリューションは、を持たない古いAPIに適していますViewPager.getCurrentItem()
。
まず、ちょっとした情報。ViewPagerのすべての子を繰り返し処理しViewPager.getChildAt(x);
、各子ビュー(ページ)でtoString()
(またはgetLeft()
)印刷してから、ページを変更するたびにこれを行うと、子が表示される論理的な順序になっていないことに気付くでしょう。ページに戻り始めたとき(最初に戻ってページング)。どうやら、それは配列から不要な子を削除し、次に最新の子を配列に追加します。したがって、たとえば、2ページを見てから3ページに変更したとすると、子のリストはこの順序page 2, page 3, page 4
にViewPager.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
ですか?まあ、私は、リスナー、他のクラス、決定的でない焦点、および他の肥大化を含める必要なしにこれを行うための簡単な方法があると思い切って決心しました。残念ながら、このソリューションは正確に単純ではありません。しかし、それは膨張、他のクラスとリスナーを排除します。もっと簡単な方法がわかれば、この関数を書き直します。あるいは、これは他の誰かがひらめきを持つための洞察を提供するでしょう。