J'ai un adaptateur de liste personnalisé:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
dans la méthode 'getView' remplacée, je fais une impression pour vérifier quelle est la position et s'il s'agit d'un convertView ou non:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
La sortie de ceci (lorsque la liste est affichée pour la première fois, aucune entrée utilisateur pour le moment)
04-11 16:24:05.860: INFO/System.out(681): getView 0 null
04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8
04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8
04-11 16:25:50.251: INFO/System.out(681): getView 1 null
04-11 16:26:01.300: INFO/System.out(681): getView 2 null
04-11 16:26:02.020: INFO/System.out(681): getView 3 null
04-11 16:28:28.091: INFO/System.out(681): getView 0 null
04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0
AFAIK, bien que je ne puisse pas le trouver indiqué explicitement, getView () n'est appelé que pour les lignes visibles. Étant donné que mon application commence par quatre lignes visibles, au moins les numéros de position passant de 0 à 3 ont du sens. Mais le reste est un gâchis:
- Pourquoi getview est-il appelé trois fois pour chaque ligne?
- D'où viennent ces convertViews lorsque je n'ai pas encore fait défiler?
J'ai fait un peu de recherche, et sans obtenir de bonne réponse, j'ai remarqué que les gens associaient ce problème à des problèmes de mise en page. Donc, au cas où, voici la mise en page qui contient la liste:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/pageDetails"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false" />
</LinearLayout>
et la disposition de chaque ligne individuelle:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"
android:padding="4dp">
<ImageView
android:id="@+id/thumb"
android:layout_width="120dp"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginRight="8dp"
android:src="@drawable/loading" />
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentBottom="true"
android:singleLine="true" />
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:paddingRight="4dp"
android:singleLine="true" />
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="17dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:paddingRight="4dp"
android:layout_alignWithParentIfMissing="true"
android:gravity="center" />
</RelativeLayout>
Merci pour votre temps
ListView
une hauteur dewrap_content
, donc il n'est pas sûr de sa hauteur, donc il présente des enfants comme une sorte de testeur pour voir ce qui convient. Changez votreListView
pourfill_parent
puis vérifiez vos journaux les appels devraient être considérablement réduits.Essayez avec
match_parent
lalayout_height
propriété de la vue de liste. Cela éviteragetView()
d'être appelé si souvent.la source
fill_parent
doit être remplacé parmatch_parent
pour le niveau d'API 8 et supérieur.Je me suis débarrassé de ce problème lorsque j'ai changé à la fois layout_width et layout_height en match_parent (changer uniquement layout_height n'a pas aidé).
Remarque utile: faites attention si vous avez des éléments imbriqués. Vous devez remplacer celui "le plus élevé" par match_parent . J'espère que ça aide quelqu'un.
la source
wrap_content
, alorsListView
vous ne savez pas combien d'élément de liste il y a pour devenir le contenu de List, c'est pourquoiListView
essaie de créer autant de lignes qu'il pense qu'il convient d'afficher, et lorsque vous utilisezfill_parent
oumatch_parent
,ListView
pense, d'accord, ma hauteur estx
et j'ai besoin dun
nombre de lignes à afficher.Je ne suis pas en mesure de répondre à votre question "Pourquoi", mais j'ai définitivement une solution au problème de l'irritant " Répétition des éléments de ListView " (si vous avez des éléments dans votre collection qui dépassent la hauteur de l'écran).
Comme beaucoup de gens ont mentionné ci - dessus, garder l' androïde: layout_height propriété du ListVew tag comme fill_parent .
Et à propos de la fonction getView (), la solution consiste à utiliser une classe statique appelée ViewHolder . Regardez cet exemple. Il effectue avec succès la tâche d'ajouter tous les éléments dans ur Array ou ArrayCollection.
J'espère que cela aide les amis !!
Meilleures salutations, Siddhant
la source
GridView
et de changerandroid:layout_height
etandroid:layout_width
ne fonctionne pas pour moi. Mais en utilisantViewHolder
des images répétées fixes pour moi, j'ai parcouru ce tutoriel android-vogue.blogspot.com/2011/06Ques: Pourquoi Adapter appelle-t-il getView () plusieurs fois? Réponse: Comme Listview est rendu lors du défilement, sa vue est actualisée avec les prochaines vues à venir, pour lesquelles l'adaptateur doit obtenir des vues en appelant getView ().
Ques: Pourquoi appelle-t-il moins si la largeur et la hauteur de la vue de liste sont définies sur fill_parent? Réponse: Parce que le gonfleur a la taille fixe de la zone d'écran pour la liste, il calcule une fois pour rendre les vues à l'écran.
J'espère que cela résoudra votre requête.
la source
J'avais le même problème avec la liste déroulante dans un AutoCompleteTextView. Je me suis battu avec le problème pendant deux jours jusqu'à ce que j'arrive ici et que vous me montriez la solution.
Si j'écris dropDownHeight = "match_parent", le problème est résolu. Maintenant, le problème est lié à l'interface utilisateur (lorsque vous avez un élément, la liste déroulante est trop grande) mais le problème des appels multiples (beaucoup plus important) est résolu.
Je vous remercie!!
la source
"Pourquoi getview est-il appelé trois fois pour chaque ligne?" Parce que getView est appelé lorsque vous faites défiler sur listview et pour dire mieux alors qu'il est appelé lorsque la position d'une vue de votre liste est modifiée!
la source
J'ai le même problème. Si la hauteur est définie sur fill_parent, alors je reçois "généralement" 2 appels par ligne. Mais, si je règle la hauteur de ma ListView à la valeur exacte, disons à 300dp, alors je reçois exactement un appel GetView par ligne.
Donc, il me semble que le seul moyen est de déterminer d'abord la hauteur de l'écran, puis de définir par programme la hauteur de listvilew à cette valeur. Je n'aime pas ça. J'espère qu'il existe un meilleur moyen.
la source
Pour tous ceux qui (après avoir réglé
height
leListView
surmatch_parent
) sont toujours bloqués (comme moi):Vous devez également définir le
height
de la mise en page parent surmatch_parent
.Voir l'exemple ci-dessous. Le
LinearLayout
est le parent ici:la source
Cela arrive peut-être tard, mais si vous utilisez,
layout_weight
n'oubliez pas de toujours définirlayout_width="0dp"
la source
J'ai fait cette solution, ce n'est peut-être pas la meilleure, mais fait le travail ...
alors =
J'espère que ça aide!
la source