2

J'ai un ViewPager qui affiche essentiellement une vue personnalisée ListFragment sauf avec des données différentes. Donc, je pense qu'il doit y avoir un moyen que je peux utiliser ce même ListFragment mais le peupler avec des données différentes en fonction de la page qu'il montre.Android: réutiliser listfragment dans viewpager

Utilisation du Google Play Stocke des données comme un exemple, je voudrais avoir

  1. page 1 - tri Paid Apps par Prix croissant
  2. page 2 - tri Paid Apps par Prix descendant
  3. Page 3 - tri Apps gratuites par Classement en baisse

Comment puis-je obtenir ce qui précède? La page 1 et la page 2 ont les mêmes données donc il faut juste les trier (je l'ai fait avec Collections.sort), mais la page 3 montre les ListFragment avec la même vue personnalisée sauf qu'il faut envoyer une requête au serveur pour télécharger des informations gratuites sur les applications au lieu.

merci! :)

+0

Passez les arguments à 'ListFragment' en utilisant la méthode' setArguments() 'et utilisez cette information dans vos pages pour différencier et adopter un comportement différent. –

+0

hmmm est-ce fait dans la méthode 'getItem' de mon' FragmentPagerAdapter'? – chongzixin

+0

cochez [this] (https://github.com/lalit3686/ViewPagerDemo) pour voir comment vous pouvez passer des arguments à Fragment. –

Répondre

0

D'accord, eh bien, voici la configuration que vous avez.

Chaque ListView est fourni des données via un ListAdapter de quelque sorte.

Un ViewPager est fourni par un PagerAdapter.

Dans ce cas, vous pouvez utiliser un seul ListAdapter qui trie les mêmes informations exactes dans l'ordre que vous voulez.

Votre FragmentPagerAdapter peut fournir le même adaptateur à chaque fragment qui partage les données. Chaque fragment peut demander les données dans l'ordre souhaité et l'adaptateur le triera et enverra les valeurs via la méthode getView() lorsque le fragment crée sa vue.

Dans le cas du FragmentPagerAdapter, il va échanger des fragments et les garder en mémoire afin qu'ils soient déjà réutilisés pour vous. Cependant, leurs points de vue peuvent être détruits et reconstruits. Chaque fois qu'un ListFragment reconstruit sa vue, il appelle la méthode getView() de l'adaptateur fourni. La méthode getView() renvoie chaque ligne de la liste en fonction de la position demandée.

Parce que ce sont les mêmes données, vous n'avez besoin que d'un adaptateur contenant les données. Cependant, il faut pouvoir obtenir l'information dans l'ordre que vous demandez. Cela peut être fait de nombreuses façons, mais vraiment tout le ListFragment se soucie de ce qu'il reçoit de getView(). Ainsi, votre ListFragment peut indiquer à votre adaptateur l'ordre dans lequel il souhaite recevoir les données. Votre adaptateur peut ensuite fournir les données dans cet ordre en fonction de la valeur de position getView().

+0

Ai-je raison de dire que la solution ci-dessus répond uniquement au tri des données (dans mon exemple Google Play Store trier les applications payantes les plus populaires dans l'ordre croissant et décroissant)?aussi, pour clarifier ma configuration (parce que je ne suis pas sûr que ça correspond exactement à ce que vous avez dit), chaque 'ListFragment' est fourni avec un' ArrayAdapter', et mon 'ViewPager' est fourni par un' FragmentPagerAdapter'. Mon 'ArrayAdapter' est créé et' ListAdapter' est défini dans 'asyncTaskCompleted' quand mon appel de service retourne. Comment est-ce que le 'ViewPagerAdapter' communique avec mon' ListAdapter' dans ce cas? – chongzixin

+0

Votre 'FragmentPagerAdapter' crée les fragments, correct? Si c'est le cas, il devrait aussi être celui qui fournit le 'ArrayAdapter' à votre' ListFragment' lors de la création. 'FragmentPagerAdapter' peut détruire la vue du fragment à tout moment, donc quand il a besoin de le reconstruire, il le fera via n'importe quel' Adapter' que vous lui fournissez. Dans ce cas, puisque toutes les données sont identiques mais triées de différentes manières, vous pouvez avoir un seul ArrayAdapter utilisé par chaque liste. Chaque liste demandera l'ordre souhaité et l'adaptateur peut fournir les vues dans cet ordre. – DeeV

+0

Je pense que je l'ai mal expliqué initialement. J'ai mis à jour ma réponse. J'espère que c'est moins déroutant. – DeeV