Je vous dis maintenant que c'est un hack, il n'y a donc aucune raison de voter pour cette raison. Cela signifie que cela vous sera utile ou non. Dans tous les cas, la description ci-dessous fournira un aperçu et sera utile à la communauté. En outre, cette solution convient aux API plus anciennes qui n'en ont pas ViewPager.getCurrentItem()
.
Tout d'abord, un peu d'informations. Si vous parcourez tous les enfants d'un ViewPager avec ViewPager.getChildAt(x);
et imprimez avec toString()
(ou getLeft()
) chaque vue enfant (une page), puis faites cela chaque fois que vous changez de page, vous remarquerez que les enfants ne seront pas dans l'ordre logique dans lequel ils sont affichés lorsque vous commencez à revenir en arrière (pagination au début). Apparemment, cela supprimera l'enfant inutile du tableau, puis ajoutera l'enfant le plus récent au tableau. Ainsi, par exemple, disons que vous regardez la page 2 puis changé en page 3, votre liste d'enfants sera dans cet ordre page 2, page 3, page 4
signifiant qui ViewPager.getChildAt(1);
renverra la page courante. Mais, si vous revenez ensuite à la page 2 (à partir de la page 3), votre liste d'enfants sera dans cet ordre, ce page 2, page 3, page 1
qui signifie queViewPager.getChildAt(1);
ne renvoie pas la page actuelle. Je n'ai pas encore été en mesure de trouver une logique simple pour éliminer la page actuelle en utilisant ces informations. Parce que l'ordre des pages dans le tableau derrière getChildAt
est dans un ordre arbitraire basé sur la façon dont l'utilisateur a paginé.
Cela étant dit, j'ai développé une solution de contournement. Je n'ai aucune idée si cette fonction fonctionnera dans tous les environnements, mais cela fonctionne pour mon projet actuel. Je suppose que si ce n'est pas le cas pour vous, c'est un problème de niveau d'API différent. Mais je ne soupçonne en fait aucun problème pour d'autres environnements.
Maintenant, sur la viande. Ce que j'ai remarqué, c'est que le résultat ViewPager.getChildAt(x).getLeft()
aura un type de coordonnée horizontale de pixel par rapport au parent. J'ai donc utilisé ces informations pour éliminer quelle vue est la vue actuelle.
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;
}
Cette fonction est probablement un hack discutable car elle repose sur la valeur de getLeft()
pour tout comprendre. Mais, j'attrape la coordonnée gauche de chaque enfant. Je compare ensuite cela aux autres valeurs et stocke les première et deuxième pages, renvoyant la deuxième page (page actuelle) hors de la fonction. Cela semble fonctionner à merveille.
Pourquoi (pourriez-vous demander) n'ai-je pas simplement utilisé onClickListenter
ou n'importe quelle solution? Eh bien, j'étais sacrément déterminé qu'il y avait un moyen simple de le faire sans avoir à inclure des auditeurs, d'autres classes, une concentration non concluante et d'autres ballonnements. Malheureusement, cette solution n'est pas tout à fait simple. Mais, cela supprime le ballonnement, les autres classes et les auditeurs. Si je peux trouver un moyen plus simple, je réécrirai cette fonction. Ou peut-être que cela permettra à quelqu'un d'autre d'avoir une révélation.