8
votes

ListView de WebViews - Réutiliser des objets de hauteur différente échoue; demande toutes les vues avant d'afficher tout

J'ai une activité qui affiche un listview . Chaque élément du listview est un linearlayout composé d'un webview . Il existe des centaines d'éléments dans la liste et chacune est une hauteur différente.

premier problème est que lors de la réutilisation d'une vue recyclée dans greview () , la nouvelle vue est toujours la hauteur de l'original. Voir, même si j'ai défini le layout_height pour les deux linearlayout et le webview sur wrap_content .

Deuxième problème est que GeveView () semble être appelé à chaque élément de la liste, même si seulement les cinq premiers ou six ajustés à l'écran. Je n'ai pas vu cela lors de l'utilisation d'autres types d'éléments de liste. Par exemple, dans un autre endroit, j'ai une liste de vues personnalisées toutes les mêmes hauteur et que je ne vois que greveView () être appelée pour le nombre de vues qui correspondent initialement à l'écran.

SO ... J'ai besoin de comprendre comment forcer le recyclé webviews pour rendre leur nouveau contenu afin que leur hauteur puisse être calculée au lieu de simplement utiliser la hauteur précédente. Et j'aimerais savoir pourquoi le système me demande tous mes articles dans ce cas.

Voici les extraits de code requis: xxx

lignes sont construits à partir de: xxx

Ceci est GETVIEW () dans mon adaptateur. Les extraits HTML proviennent d'une gamme de cordes pour l'instant. xxx


2 commentaires

Voudrais connaître la réponse à cela, en particulier la hauteur de la rangée collant sur des vues recyclées. J'ai un problème similaire d'une vision d'image qui a "Fill_Parent" appliqué verticalement, mais la mise en page est conçue pour réduire au minimum 100 humexités. Avec des données codées en dur, cela fonctionne et sur la création, cela fonctionne, mais après le recyclage de la vue refuse de rafraîchir toutes les informations de mise en page et rétrécissez à la taille minimale. J'échappe la taille minimale en ayant une vue transparente de 1px définie sur la hauteur minimale de la ligne et j'ai l'ensemble de la ligne de mise en page définie sur "Wrap_Content".


Essayez de remplacer Layoutchildern sur votre liste de réception. Il y a quelques exemples utilisant cette méthode Ici et ici . Une autre option que je peux penser, c'est appeler getméasureheight () sur la vision webview afin qu'il soit réellement mesuré, peut-être appeler invalider () à la liste de réception.


4 Réponses :


4
votes

Je pense que le problème est que, avec le code que vous avez écrit, le système mesure d'abord la hauteur de conteneur (ligne linear_layout), puis le contenu (webview). Mais la deuxième mesure n'affecte pas la première jusqu'à ce que vous appeliez invalider ou une méthode qui rend le conteneur à recalculer sa taille.

À propos de la raison pour laquelle votre méthode GeveView est appelée plusieurs fois, vérifiez votre méthode GevevieCount () de votre adaptateur. xxx

Documentation stipule que:

"Cette méthode renvoie le nombre de types de vues qui seront créées par GeveView (int, vue, groupe de spectacles). Chaque type représente un ensemble de vues qui peut être converti dans GeveView (int, vue, Groupe de spectacles). Si l'adaptateur toujours retourne le même type de vue pour tous Articles, cette méthode devrait renvoyer 1. Cette méthode ne sera appelée que lorsque Lorsque l'adaptateur est réglé sur le Adapterview. "

J'ai eu un problème avec cette méthode, donnant un gros nombre (comme 5000) fait mon crash de mon application, il semble qu'il est utilisé en interne pour certains calculs de liste de vue de liste.

espère qu'il aide d'une manière ou d'une autre .

BTW, il y a une très bonne conversation sur Le monde de listeViews


1 commentaires

Qu'entendez-vous par NumberOtTypeOfviewsinyourlist Est-ce le nombre d'éléments de la liste <>?



1
votes

Ma solution (même si je mets la prime) car mon problème était de mettre la vision de l'image dans un Framelayout, il a grandi intelligemment.

Invalidation de la vue ou de forçage Les calculs de présentation n'ont rien fait pour moi, mais le conteneur Framelayout pour l'image d'image semblait tout résoudre. Je suppose que ce comportement est en erreur, mais la solution de contournement était assez simple.

Peut-être la même chose s'appliquera à la vision Web de l'OP.


1 commentaires

Je l'ai essayé, mais je n'ai pas travaillé pour moi (utilisé WebView au lieu de ImageView).



3
votes

J'ai eu le même problème avec ma visablisteView. D'autres messages, il semble être un problème continu avec plusieurs webviews dans une liste. Le travail autour que j'ai trouvé était de créer et de créer des wewviews La première gevview est appelée, puis renvoie ensuite le webview à l'index correct. C'est un peu plus intensive de mémoire mais cela ne fait que redimensionner la vue. xxx


3 commentaires

Une solution très sale. Mais le meilleur que j'ai vu jusqu'à présent! Vous pouvez faire une sorte de piscine de WVGRoup, vous avez donc un nombre maximum de webviews en mémoire.


C'est une assez sale solution mais cela fonctionne. Le seul problème que j'ai trouvé était que cela ne pouvait pas obtenir d'animations pour fonctionner correctement avec tous les webviews. En développant lentement la liste de réception, sautant à la position, etc. Je finis par mettre fin à la mise au rebut de l'expansionView et utilise JavaScript pour obtenir l'effet accordéon avec une vision Web unique. C'est un peu plus lent ça marche aussi :)


Ce que je fais maintenant ne reçoit que les hauteurs des maisons Web et les ajoutent dans un tableau. Cela fonctionne vraiment bien aussi bien. Je viens d'ajouter une réponse séparée à cette question.



3
votes

J'ai essayé la solution de Sirfunkenstine qui fonctionne bien. Seul le client, pour lequel je construis cette application, n'a pas aimé la performance. Et je devais admettre que ce n'était pas si doux.

Il semblait que l'ajout et la suppression des valeurs Web préchargées où le problème. L'interfoncurier a été gelé pour une seconde seconde chaque fois que l'application a ajouté / supprimé la nouvelle webview pour la ligne suivante.

Solution

Je pensais que ça Soyez mieux pour ajuster le contenu et la hauteur de la vision Web au lieu d'ajouter / supprimer. De cette façon, nous n'avons que la quantité de webviews actuellement visible en mémoire. Et nous pouvons utiliser la fonctionnalité de réutilisation de l'adaptateur ListView / Adapter.

J'ai ajouté une vision Web unique derrière la liste de liste qui calcule constamment la hauteur WebView des éléments suivants. Vous pouvez obtenir la hauteur avec la méthode WebView GetContyeight. Vous devrez le faire dans la méthode OnpageFinished afin que vous ayez la hauteur finale. Cela a soulevé une autre question, car la méthode renvoie zéro lorsque le contenu est chargé avec des méthodes LoadDawithbaseURL ou LoadData. Il semble que la valeur soit définie éventuellement, mais pas encore au moment de la formation sur l'ondulée. Pour surmonter cela, vous pouvez ajouter un fil qui vérifie constamment si le getContyeight n'est plus nulle. Si ce n'est pas zéro, la valeur est définie et que vous pouvez charger le suivant.

Toute cette solution est un peu hacky, mais cela m'a donné une belle et lisse ListView, y compris Webviews avec différentes hauteurs.

Quelque exemple de code:

1: file d'attente Les positions des rangées que vous souhaitez précharger: xxx p> 2: Démarrez l'exécutable pour charger constamment de nouveaux éléments de la file d'attente et vérifier / ajouter la hauteur à un tableau: xxx

3: Chargez le nouveau contenu HTML et vérifiez les hauteurs: xxx


0 commentaires