1

Ich habe eine benutzerdefinierte ArrayAdapter für eine ListView, die ein benutzerdefiniertes Zeilenlayout verwendet, separat in XML definiert. Das Layout ist nur drei TextViews und ein ImageView, zusammen in einem RelativeLayout. Um die Leistung zu verbessern, verwendet der Adapter ein ViewHolder-System wie das zuvor beschriebene here, um vorhandene Ansichten zu konvertieren, anstatt neue aufzublähen. In ArrayAdapter.getView() soll der Adapter das erste TextView fett oder unbold machen, abhängig von einem booleschen Wert.Android ArrayAdapter konvertiert Ansichten nicht richtig

Wenn ich die App zum ersten Mal öffne, sind alle TextViews ordnungsgemäß fett oder ungebunden. Wenn ich jedoch bis zum Ende der ListView blättern und dann zurück zum Anfang scrollen, sind alle TextViews des Titels fett, auch wenn sie nicht sein sollten. Ich denke, es muss etwas damit zu tun haben, vorhandene Ansichten, die bereits fett sind, zu konvertieren, aber ich kann nicht herausfinden, was es ist. Ich habe die App mit Android Studio debuggt, und es läuft genau so, wie ich es denke - wenn ich zurück scrolle, macht der Adapter richtig fett im Debug-Fenster, aber alle scheinen in der App fett zu sein.

Eine Sache, die ich bemerkt habe, ist, dass, wenn ich das textStyle Attribut der TextView zu "fett" ändere, alle Titel TextViews von Anfang an fett sind und sich nie ändern. Es ist nur, wenn ich textStyle entferne oder es auf "normal" setze, dass die TextViews am Anfang normal sind.

Hier getView() in dem ArrayAdapter:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    PostShell shell = postShellList.get(getCount() - 1 - position); //I stack my ListView backwards, so index 0 is at the bottom 
    ViewHolder holder; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.row_layout, parent, false); 
     holder = new ViewHolder(); 
     holder.firstLine = (TextView) convertView.findViewById(R.id.firstLine); 
     holder.secondLine = (TextView) convertView.findViewById(R.id.secondLine); 
     holder.thirdLine = (TextView) convertView.findViewById(R.id.thirdLine); 
     holder.image = (ImageView) convertView.findViewById(R.id.image); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.firstLine.setText(shell.postTitle); 
    if (shell.unread) { 
     holder.firstLine.setTypeface(holder.firstLine.getTypeface(), Typeface.BOLD); 
    } else { 
     holder.firstLine.setTypeface(holder.firstLine.getTypeface(), Typeface.NORMAL); 
    } 
    //convert other TextViews 
} 

Meine ViewHolder Klasse nur eine statische Klasse mit einem paar Textviews und ein Image ist.

Und hier ist der relevante Teil des Codes für die Zeile Layout Ich verwende:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="88dp"> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="84dp" 
    android:paddingRight="16dp" 
    android:paddingTop="6dp" 
    android:id="@+id/firstLine" 
    android:ellipsize="end" 
    android:text="First" 
    android:textStyle="normal" 
    android:singleLine="true" /> 

<!-- other views --> 

</RelativeLayout> 
+0

der Fluch von Copy-and-Paste ... Danke für die Lösung meiner Antwort :) – 0X0nosugar

+0

@ 0X0nosugar Kein Problem, danke für die Beantwortung! :) – weirdo16

Antwort

1

Das Problem scheint zu sein, dass "unboldening" der Text nicht mit der folgenden Anweisung funktioniert:

holder.firstLine.setTypeface (holder.firstLine.getTypeface(), Typeface.NORMAL);

Der folgende Ausschnitt verlässt den holder.firstLine.getTypeface() aus und verwendet nur eine einfachere Auswahl von setTypeface(). Arbeitete für mich.

if (shell.unread) { 
    holder.firstLine.setTypeface(holder.firstLine.getTypeface(), Typeface.BOLD); 
} else { 
    holder.firstLine.setTypeface(Typeface.DEFAULT); 
} 
0
PostShell shell = postShellList.get(getCount() - 1 - position); //I stack my ListView backwards, so index 0 is at the bottom 

Wenn die ListView für das Element an einer bestimmten Position fragt, würden Sie besser geben die Element an dieser Position oder es wird verwirrt sein. WENN Sie die Reihenfolge der Elemente in der Liste ändern möchten, ändern Sie die Reihenfolge der Liste, versuchen Sie nicht, ListView in das Rendern in einer anderen Reihenfolge auszutricksen.

Verwandte Themen