web-dev-qa-db-fra.com

Limite de pages hors écran de ViewPager

Existe-t-il un moyen de contourner le comportement normal de ViewPager et son limite de page hors écran? Mon ViewPager contient quatre fragments, chacun contenant un gridview d'images. Le problème que j'ai est que sur instansiation du ViewPager, deux fragments sont créés, ce qui entraîne qu'environ 20 images (environ 10 par fragment) sont téléchargées/récupérées à partir de catch simultanément. Est-il possible de désactiver la limite de pages hors écran?

Mon objectif est de télécharger uniquement les images lorsqu'un fragment est sélectionné, ou uniquement lorsque l'utilisateur survole l'image. Une façon d'y parvenir consiste à utiliser l'écouteur onPageSelected et à définir un indicateur, qui indique au GridViewAdapter s'il est autorisé à télécharger l'image ou non.

Une deuxième façon de penser est de définir un HoverListener sur le ImageView, et de télécharger uniquement l'image sur onHover, mais cet écouteur n'est disponible que dans la version 4.0 et les versions ultérieures .

Existe-t-il un meilleur moyen d'y parvenir?

27
user634545

Est-il possible de désactiver la limite de pages hors écran?

Non. Il est déjà réglé sur la valeur minimale possible: une page de chaque côté de la page consultée. Ceci est nécessaire pour que les effets d'animation fonctionnent - vous voyez des parties de deux fragments (original et nouveau) en même temps.

Mon objectif est de télécharger uniquement des images lorsqu'un fragment est sélectionné, ou uniquement lorsque l'utilisateur survole l'image.

Chargez ensuite votre grille avec des images d'espace réservé et ne chargez pas les images réelles jusqu'à ce que la page soit modifiée.

Notez également que "survoler" implique une sorte de souris ou une sorte de pointeur similaire, qui n'est pas utilisé sur la plupart des appareils Android.

40
CommonsWare

Définissez simplement la limite hors écran à un.

ViewPager mViewpager = (ViewPager)findView....
mViewPager.setOffscreenPageLimit(1);
30
DroidBender

Mon objectif est de télécharger des images uniquement lorsqu'un fragment est sélectionné

Vous pouvez utiliser la fonction de rappel setUserVisibleHint(boolean isVisibleToUser) du fragment dans votre ViewPager.

6
Hasina

Vous pouvez également le faire en xml en utilisant Android Liaison de données:

<Android.support.v4.view.ViewPager
    [...]
    app:offscreenPageLimit="@{1}"
    [...]
</Android.support.v4.view.ViewPager>
3
Dawid Hyży

Poignée viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()

À l'intérieur, supprimez les vues supplémentaires après position + 1 Et avant position - 1 En utilisant viewPager.removeViewAt(int) (c'est-à-dire limiter le téléavertisseur pour ne charger que 3 pages: en cours, précédente et suivante.

Ensuite, vous devez gérer destroyItem dans l'adaptateur Viewpager, recycle() ing les bitmaps dans la vue détruite.

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    LinearLayout layout = (LinearLayout) object;
    ((ViewPager) container).removeView(layout);
    ImageView imgDisplay = (ImageView) layout.findViewById(R.id.quranPage);
    Drawable drawable = imgDisplay.getDrawable();
    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        Bitmap bitmap = bitmapDrawable.getBitmap();
        if (bitmap != null) //when reading page fails, this will be null
            bitmap.recycle();
    }
}
2
FindOut_Quran

Pour éviter de télécharger les images sans que l'utilisateur ne défile jusqu'au fragment, vous pouvez remplacer "setUserVisibilityHint (boolean visibleToUser)" et charger vos images uniquement si "visibleToUser" devient vrai

1
McLeroy Ibe

mViewPager.setOffscreenPageLimit(1); ne donnera pas ce que vous voulez, il chargera le fragment voisin s'il n'est pas déjà chargé (cela signifie qu'il chargera 2 fragments).

Disons que si vous voulez charger tous vos fragments (4 fragments) à la fois, alors n'utilisez que setOffscreenPageLimit(3), sinon évitez d'utiliser setOffscreenPageLimit.

Je pense que vous ne pouvez pas changer le comportement par défaut du fragment voisin de chargement du viewpager.

0
vikas singh