Android Listview Mesurer La Hauteur
J'essaie de trouver un moyen de régler la hauteur d'une listview en fonction de la hauteur de ses enfants. J'ai suivi la solution donnée ici:
Comment puis-je mettre un ListView dans un ScrollView sans qu'il s'effondre?
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
//pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if(listItem != null){
listItem.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
listItem.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
//listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
Maintenant j'appelle la fonction ci-dessus sur la liste comme ceci:
public void displayReviews(ArrayList<Reviews> resultReviews){
//Hide the loading progress
hideReviewsLoading();
if(resultReviews != null && resultReviews.size() > 0){
mCurrentReviewList.onFetchFinished(resultReviews);
setListViewHeightBasedOnChildren(mCurrentReviewList.getListView());
}
else{
//Display a generic text to indicate no reviews are in yet
displayEmptyText();
}
}
Ici au-dessus de la mCurrentreviewList est un ListFragment qui, fondamentalement, a un adaptateur pour définir les éléments à l'intérieur d'une mise en page.
Le problème, je vais avoir, c'est que la hauteur de chaque listitem qu'il n'est pas exact. Et à la fin, lorsque tous les éléments de la liste(examens) sont peuplées de l'ensemble de la listview qu'il contient, n'a jamais complètement affiche tous les éléments de la liste. Il coupe quelque part ci-dessous - Comme le montre seulement 7.5 examens de un à 10.
Je ne suis pas sûr de ce que je fais mal. Toute aide et la direction serait grandement apprécié!
ListView
est vraiment ce que vous voulez ici ?Ouais, je pense qu'une ListView est la meilleure solution que j'ai pour la mise en page je suis à la recherche à mettre en œuvre. Voici un rudimentaire mise en page j'ai dessiné pour expliquer ce que je suis en train de réaliser. dropbox.com/s/6mhf2xfqwkz2zsi/2014-02-06%2022.56.35.jpg je suis sur un TabHost et chaque Onglet lance un fragment avec le FragmentList que j'ai décrit ci-dessus. Donc, je n'ai pas besoin d'une listview qui défile en fait dans cette petite fenêtre. Un exemple de la mise en œuvre peut être trouvé dans l'application 500px. (Capture d'écran: dropbox.com/s/h4q5poiqfvdpmwa/2014-02-07%2006.57.33.png) et aussi dans google plus app.
Ok regarde comme si j'étais en mesure de comprendre pourquoi la mesure a été inexacte. Pour ListItem de la variable/dynamique de la hauteur, cela ne fonctionnera pas. La mesure de connaître au moins une variable, et en ce cas, il sera la largeur constante. Donc, d'abord calculer la largeur désirée de la liste que vous connaissez va être constante, en utilisant: int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); et puis la passer à la listitem mesure
OriginalL'auteur falc0nit3 | 2014-02-07
Vous devez vous connecter pour publier un commentaire.
Ok regarde comme si j'étais en mesure de comprendre pourquoi la mesure a été inexacte. J'ai essayé d'obtenir une mesure de la liste de la hauteur en passant
Pour ListItem de la variable/dynamique de la hauteur, cela ne fonctionnera pas. La mesure de connaître au moins une variable, et en ce cas, il sera la largeur constante. Donc, d'abord calculer la largeur désirée de la liste que vous connaissez va être constante, à l'aide de:
et puis la passer à la listitem mesure. Plein de code est donné ci-dessous:
Veuillez Noter C'est un hackish la mise en œuvre et n'est pas recommandé. Veuillez voir Comment puis-je mettre un ListView dans un ScrollView sans qu'il s'effondre? et de comprendre exactement ce que vous faites avant la mise en œuvre de cette.
Wow c'viens de faire ma journée! J'ai été en mesure avec 0,0 et qui me donnait un faux hauteur, cependant dès que je l'ai changé pour utiliser la largeur réelle et AT_MOST il a parfaitement fonctionné!!
Grand morceau de code, jusqu'à présent, ce n'était que de travail pour ma listview qui a une hauteur variable, en effet il mesure parfaitement à la largeur spécifiée au début. Merci!
J'ai frappé un problème. Lorsque mon application se charge tout d'abord, il mesure ok et définit la hauteur nécessaire. Cependant, si mon activité est recréé, mon ListView triples en hauteur, mais il contient le même nombre d'éléments. J'ai remarqué que si je le délai de la minuterie de la création de ma ListView (500ms), le problème disparaît, et je reçois la bonne hauteur sur les loisirs de l'activité. Je me demande pourquoi? Par la façon dont elle est un fragment de l'activité à l'intérieur d'un onglet.
Je ne sais pas pourquoi, mais vous pouvez essayer d'appeler le morceau de code qui remeasuring(par exemple setListViewHeightBasedOnChildren de fonction) dans le onActivityCreated fonction de votre fragment.
OriginalL'auteur falc0nit3
ListView est censé pour faire défiler - de sorte que vous pouvez, en théorie, avoir nombre infini d'éléments. Pas besoin de régler la longueur de la liste basée sur la façon dont de nombreux éléments sont à l'intérieur.
Si vous avez besoin de définir la durée, alors que les défaites le but d'avoir un ListView. Veuillez utiliser une autre vue comme Verticale ScrollView ou quelque chose pour ce que vous avez besoin.
Je pense que ListView est ce que u besoin. Assurez-vous que vous allouer le reste de l'espace de l'écran dans votre mise en page de la liste. Et puis vous ajoutez que de nombreux éléments à l'intérieur comme vous l'avez fait. La liste de défilement naturellement. Pas besoin d'attribuer fixer la taille de la liste. Quel que soit l'écran est à gauche après la ponte, les parties de l'écran doit être utilisé par les ListView - assurez-vous que dans votre fichier xml.
Ouais pour l'instant, si j'ai fondamentalement ne pas appeler la "setListViewHeightBasedOnChildren' fonction pour réinitialiser la liste de hauteur, il va se comporter comme vous le décrivez. J'ai alloué de l'espace restant à la hauteur de la listview. Mais il est juste la moitié de la taille de l'écran de mon téléphone(et je suis sur un 4.7" téléphone). Sur un petit téléphone, et la fenêtre de la liste va être très petites et l'utilisateur doit garder le défilement de lire un seul élément.(probablement juste de 4 à 6 lignes à la fois). Il est certainement ne va pas l'air bien. 500px et google plus ont il bien mis en œuvre, et sûrement d'autres applications. Vous ne savez pas comment
OriginalL'auteur VJ Vélan Solutions
Je n'ai pas assez de réputation pour le commentaire mais en ce qui concerne falc0nit3 réponse, j'ai eu cette mise en œuvre, mais par la suite mené à une erreur de mémoire insuffisante avec de grandes cellules qui ont une image etc.
C'est à cause de la première ligne
View listItem = listAdapter.getView(i, null, listView);
de la boucle for.Passage de la valeur null dans la convertView paramètre conduira à l'adaptateur de gonflage de chaque ligne de votre liste. Ce n'est pas l'idéal, donc au lieu de passer dans une déjà gonflé ligne de sorte que le getView n'a qu'à remplacer le contenu à l'intérieur de la ligne (par exemple, gonfler la première ligne de la liste vous-même et continuer à l'utiliser). Voir sous "Vue du Recyclage" dans le lien suivant http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/
OriginalL'auteur d4n13l
falc0nit3's réponse (reconnus) fonctionne pour moi, cependant, je vous suggère d'ajouter le code suivant juste après la boucle for si vous utilisez liste des diviseurs de
Donc le dernier extrait de code devrait ressembler à ceci:
OriginalL'auteur X-Mohamed Ahmed