2017-03-02 3 views
0

Ich versuche detaillierte Produktinformationen in einem benutzerdefinierten Listview mit zwei TextViews pro Zeile für das Schlüssel/Wert-Paar anzuzeigen. Die Daten werden korrekt angezeigt. Ich habe auch jede zweite Zeile anders gefärbt.Android - Benutzerdefinierte ListView Viewholder

Und da ist mein Problem. Wenn ich die verschiedenen farbigen Reihen nach oben und unten scrolle, ändere ihre Farbe und bleibe in diesem Zustand. Die Daten sind von diesem Problem nicht betroffen. Nur die Hintergrundfarbe der TextViews. Ich benutze das ViewHolder Pattern, aber das änderte nichts. Ich habe den Code des Adapters hinzugefügt. Ich denke das ist genug. Hast du eine Idee?

Screenshot des Problems:

enter image description here

Code:

public class ProductDetailAdapter extends BaseAdapter { 

private LinkedHashMap<String,String> list; 
private Context context; 

public ProductDetailAdapter(Context c, LinkedHashMap<String,String> list){ 
    super(); 
    this.context = c; 
    this.list=list; 

} 
@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public Object getItem(int position) { 
    return list.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup viewGroup) { 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    ProductDetailAdapter.ViewHolder viewHolder; 

    if(convertView == null){ 
     convertView=inflater.inflate(R.layout.product_detail_data_row,null); 
     viewHolder = new ViewHolder(); 
     viewHolder.textViewKey = (TextView) convertView.findViewById(R.id.productDataKey); 
     viewHolder.textViewValue = (TextView) convertView.findViewById(R.id.productDataValue); 
     convertView.setTag(viewHolder); 

    }else { 
     viewHolder = (ProductDetailAdapter.ViewHolder) convertView.getTag(); 
    } 

    viewHolder.textViewKey.setText((String)list.keySet().toArray()[position]); 
    viewHolder.textViewValue.setText(list.get(list.keySet().toArray()[position])); 

    if(position % 2 == 0){ 
     viewHolder.textViewKey.setBackgroundColor(context.getResources().getColor(R.color.colorParkerWhite2)); 
     viewHolder.textViewValue.setBackgroundColor(context.getResources().getColor(R.color.colorParkerWhite2)); 
    } 

    return convertView; 
} 

private static class ViewHolder { 

    public TextView textViewKey; 
    public TextView textViewValue; 

    public ViewHolder(){}; 

} 
} 
+0

Die Bild-URL ist gebrochen wird funktionieren. Bearbeite deine Frage bitte. Danken! – aldakur

+1

image url: https://i.stack.imgur.com/OS3Op.png funktioniert gut für mich – Mike

+0

Versuchen Sie, eine neue 'ViewHolder-Instanz 'in' if (Position% 2 == 0) 'zu erstellen – aldakur

Antwort

4

Das geschieht, weil die Reihen recycelt werden. Es ist ein häufiges Problem.

Sie können es lösen, indem Sie:

if(position % 2 == 0){ 
    viewHolder.textViewKey.setBackgroundColor(context.getResources().getColor(R.color.colorParkerWhite2)); 
    viewHolder.textViewValue.setBackgroundColor(context.getResources().getColor(R.color.colorParkerWhite2)); 
} else { 
    viewHolder.textViewKey.setBackgroundColor(context.getResources().getColor(R.color.colorParkerWhite1)); //Or the color that you want for odd rows 
    viewHolder.textViewValue.setBackgroundColor(context.getResources().getColor(R.color.colorParkerWhite1)); //Or the color that you want for odd rows 
} 
0

Try this:

super(c, 0, list); 

statt dessen:

super(); 

Sobald Sie die Datenquelle an den Adapter übergeben Sie kein längerer Bedarf:

getCount

getItem

GetItemID

Verwandte Themen