2011-03-07 5 views
0

J'ai un ListView avec un adaptateur personnalisé qui crée des lignes contenant des TextViews pouvant contenir 1 ou 2 lignes de texte.Disposition falsifiée dans ListView après le défilement

news_row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal"> 

    <TextView android:id="@+id/text" 
     android:layout_width="fill_parent" 
     android:layout_height="48dip" 
     android:padding="6dp" 
     android:textSize="14sp"> 
    </TextView> 
</LinearLayout> 

L'adaptateur:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.news_row, null); 
    } 
    else { 
     TextView titleView = (TextView)convertView.findViewById(R.id.text); 
     System.out.println(titleView.getText() + " to **" + 
       stories.get(position).title); 
    } 

    TextView titleView = (TextView)convertView.findViewById(R.id.text); 
    titleView.setText(stories.get(position).title); 
    titleView.setGravity(Gravity.CENTER_VERTICAL); 

    return convertView; 
} 

Après défilement, certains TextViews une seule ligne apparaît aligné sur la partie supérieure de la rangée, et des deux TextViews de ligne sont à la en bas de la rangée. Le problème semble se produire lorsqu'une ligne qui contenait à l'origine une TextView à 2 lignes reçoit une seule ligne de texte, et vice-versa.

Je pensais que la définition de Gravity dans getView résoudrait ce problème de recyclage de ligne mais cela doit être autre chose. Que faire si je crée le TextView par programme chaque fois que la ligne est recyclée? Est-ce ce qu'il faut pour le "réinitialiser"?

Répondre

0

La solution était de définir le nombre de textView de lignes (comme Veeresh dit), mais pas pendant inflate initiale.

titleView.setLines(2); 

Pas exactement satisfaisante (si j'ai n lignes?) Et il n'a même pas de sens étant donné que la hauteur du textView est déjà explicitement défini dans le fichier de mise en page. Tant pis.

1

Les vues de lignes sont réutilisées dans listView. les dix premiers (je suppose que 10 ou peut-être moins) sont gonflés la première fois et la taille/gravité etc. Lorsque les utilisateurs défilent en dessous des lignes visibles, la ligne supérieure est recyclée et envoyée à la prochaine ligne suivante. Ainsi, la vue de la rangée la plus haute est réutilisée pour la prochaine rangée suivante. Si votre rangée supérieure et la prochaine rangée suivante ont un nombre différent de lignes, le comportement que vous voyez est attendu.

Solution. Définissez la gravité du texte et le nombre de lignes pendant le gonflement initial, toutes vos lignes seront de la même taille quel que soit le nombre de lignes qu'elles contiennent. Vous ne devriez plus voir la fluctuation que vous observez.

Voir cette explication pour plus de détails http://android.amberfog.com/?p=296

+0

Je ne comprends pas - comment puis-je régler le nombre de lignes pendant le gonflage initial? Je veux que le texte soit centré indépendamment du nombre de lignes. Le tutoriel implique que je voudrais utiliser différentes dispositions pour obtenir ce résultat, ce qui n'a pas de sens pour moi. Je ne sais même pas comment je pourrais déterminer le nombre de lignes dont TextView aura besoin pour rendre le texte. –

Questions connexes