Défilement infini dans LinearLayout / ScrollView?
-
28-10-2019 - |
Question
Je sais qu'il est en quelque sorte possible de créer un ListView qui charge plus de données lorsque l'utilisateur a atteint le bas de la liste. Cependant, je travaille avec un ScrollView, dans lequel j'ai un LinearLayout, et ces deux composants fonctionnent très bien avec le défilement, etc. Mais je ne sais pas comment je suis censé faire pour obtenir un parchemin infini.
Je suppose que je dois ajouter quelque chose qui lit ce qui est montré du LinearLayout à l'écran, et quand il calcule que c'est le bas du LinearLayout qui est affiché (en utilisant la position actuelle et la hauteur de la vue ), il déclenche un événement.
Mais comme je l'ai dit, je ne sais pas comment y parvenir. Donc, si quelqu'un peut m'aider, je serais très reconnaissant.
EDIT: J'ai trouvé ce post ici sur StackOverflow Comment déclencher un événement lorsque scrollView atteint le bas avec Android? , mais je ne sais pas quoi faire avec la réponse:
Compte tenu des exigences, vous allez probablement étendre BaseAdapter (par opposition à CursorAdapter qui utilise un mécanisme différent).
Voici un extrait pour cela:
public View getView(int position, View convertView, ViewGroup parent) { if (position == backingLinkedList.size()) { //get more items and add them to the backingLinkedList in a background thread notifyDataSetChanged(); } }
La solution
Si vous pouvez déclencher un événement lorsque vous atteignez le bas d'une vue déroulante, vous pouvez essayer de créer votre propre type de vue pour contenir vos données.Lorsque vous atteignez le bas de la vue, chargez les données suivantes dans votre classe de vue et ajoutez-les dans la disposition de la vue de défilement.
Donc, en gros, créez une classe qui contient une section de ce que vous montrez.Ajoutez le premier dans la vue de défilement.Lorsque vous touchez le bas, créez une autre vue contenant vos prochaines données et utilisez scrollviews_layout.addview(view_holding_the_new_data)
Autres conseils
Je sais que cela a été résolu il y a longtemps, mais je voulais partager ma solution pour les futurs scrollers infinis.
J'ai utilisé la méthode onScroll
dans le OnScrollListener
pour déclencher un thread d'arrière-plan pour saisir plus de données et adapter.notifyDataSetChanged
pour notifier au ListView
plus de données à charger et créer un défilement infini.Pour une raison quelconque, onScrollStateChanged
ne se déclenchait pas, mais onScroll
a fait ce dont j'avais besoin, donc je n'ai pas eu à m'inquiéter.
Pendant très longtemps, je n'ai pas compris comment empêcher le ListView
de se recharger et de me remettre en haut de la liste, mais j'ai ensuite réalisé que je n'avais besoin que d'initialiser un nouvel adaptateur et d'appeler setListAdapter
une fois, et à chaque foisaprès cela, appelez uniquement notifyDataSetChanged
.Avant, j'appelais aussi setListAdapter
, me replaçant ainsi en haut.