Size şimdi bunun bir hack olduğunu söylüyorum, bu nedenle olumsuz oy kullanmak için bir neden yok. Yani, ya özellikle size yardımcı olacak ya da olmayacak. Her iki durumda da, aşağıdaki açıklama bazı bilgiler sağlayacak ve topluluğa yardımcı olacaktır. Ayrıca bu çözüm, sahip olmayan eski API'ler için iyidir ViewPager.getCurrentItem()
.
Önce biraz bilgi. ViewPager'ın tüm alt öğelerini yinelerseniz ViewPager.getChildAt(x);
ve her çocuk View (bir sayfa) ile toString()
(veya getLeft()
) çıktı alırsanız ve bunu her sayfa değiştirdiğinizde, çocukların görüntülendikleri mantıksal sırada olmayacaklarını fark edeceksiniz. sayfalara geri dönmeye başladığınızda (başa dönerek). Görünüşe göre, gereksiz çocuğu diziden kaldıracak ve ardından en yeni çocuğu diziye ekleyecektir. Yani, örneğin, daha sonra sayfa 3 değiştirildi sayfa 2 bakıyor diyelim, çocukların listenizin bu sırada olacak page 2, page 3, page 4
anlamına ViewPager.getChildAt(1);
Geçerli sayfayı dönecektir. Ancak, daha sonra 2. sayfaya (3. sayfadan itibaren) geri dönerseniz, çocuk listeniz bu sırada olacaktır page 2, page 3, page 1
, yaniViewPager.getChildAt(1);
mevcut sayfayı döndürmez. Bu bilgiyi kullanarak mevcut sayfayı ayıklamak için henüz basit bir mantık bulamadım. Çünkü arkadaki dizideki sayfaların getChildAt
sırası, kullanıcının nasıl sayfalandığına bağlı olarak gelişigüzel bir sıradadır.
Bununla birlikte, bir hile çözümü geliştirdim. Bu işlevin tüm ortamlarda çalışıp çalışmayacağına dair hiçbir fikrim yok, ancak mevcut projem için çalışıyor. Sizin için değilse, o zaman farklı API seviyesinde bir sorun olduğundan şüpheleniyorum. Ama aslında diğer ortamlar için herhangi bir sorundan şüphelenmiyorum.
Şimdi etin üzerine. Fark ettiğim şey, sonucunun ViewPager.getChildAt(x).getLeft()
ebeveyne göre bir tür yatay piksel koordinatına sahip olacağıydı. Bu yüzden, bu bilgiyi hangi görüntünün mevcut olduğunu ayıklamak için kullandım.
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;
}
Bu işlev muhtemelen şüpheli bir hack'tir çünkü getLeft()
hepsini çözmenin değerine dayanır . Ama her çocuğun sol koordinatını alıyorum. Daha sonra bunu diğer değerlerle karşılaştırıyorum ve birinci ve ikinci sayfaları kaydedip ikinci sayfayı (mevcut sayfa) işlevden çıkarıyorum. Güzel çalışıyor gibi görünüyor.
Neden (sorabilirsin) sadece kullanmadım onClickListenter
ya da başka bir çözüm? Dinleyicileri, diğer sınıfları, sonuçsuz odaklamayı ve diğer şişkinlikleri dahil etmek zorunda kalmadan bunu yapmanın basit bir yolu olduğuna karar verdim. Ne yazık ki bu çözüm tam olarak basit değil. Ancak, şişkinliği, diğer sınıfları ve dinleyicileri ortadan kaldırır. Daha açık bir yol bulabilirsem, bu işlevi yeniden yazacağım. Ya da belki bu, bir başkasının bir aydınlanma yaşaması için içgörü sağlayacaktır.