2012-04-03 22 views
0

In meiner App zeige ich einige Informationen und je nach Wert ändere ich die Farbe der TextView.CursorAdapter seltsames Verhalten

public class DealsAdapter extends CursorAdapter { 
    private Cursor mCursor; 
    private Context mContext; 
    private final LayoutInflater mInflater; 

    public DealsAdapter(Context context, Cursor cursor) { 
     super(context, cursor, true); 
     mInflater = LayoutInflater.from(context); 
     mContext = context; 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     final View view = mInflater.inflate(R.layout.deals_row, parent, false); 
     return view; 
    } 

    @Override 
    public void bindView(View row, Context context, Cursor cursor) { 
     Text View percent = (TextView) row.findViewById(R.id.tvPercent); 
      percent.setText(cursor.getString(cursor 
       .getColumnIndex(DBHelper.D_PERCENT))); 
      float percentV = cursor.getFloat(cursor 
       .getColumnIndex(DBHelper.D_PERCENT)); 
      if (percentV >= 41 && percentV <= 70) { 
      // Orange 
      percent.setTextColor(Color.parseColor("#F58549")); 
     } else if (percentV >= 71) { 
      // Green 
      percent.setTextColor(Color.parseColor("#17D11D")); 
     } 
} 

Das Problem ist, nachdem ich rauf und runter scrollen die Farben beginnen durcheinander zu kommen, aber die Werte bleiben gleich.

Irgendwelche Ratschläge?

Edit: Im XML-Format habe ich die Farbe auf rot eingestellt und nur bei Bedarf geändert.

Antwort

1

Sie setzen nicht explizit eine Farbe, wenn percentV < 41. Das bedeutet, dass das Objekt die zuvor angezeigte Farbe behält und unvorhersehbare Ergebnisse liefert.

Dies ist, weil jedes Element View aus Leistungsgründen wiederverwendet werden kann. Wenn Sie einen Eintrag am oberen Bildschirmrand scrollen, können Sie für den neuen Eintrag am unteren Bildschirmrand dieselbe View verwenden, um die Kosten für das Aufblasen eines neuen Eintrags jedes Mal zu sparen. Sie müssen die Standardfarbe explizit in bindView() festlegen, sonst behält die View die Farbe, die sie für das letzte Element hatte, das sie enthielt.

+0

ich die Farbe in xml auf rot gesetzt und nur bei Bedarf geändert werden. –

+0

Sie können das nicht tun. Ansichten in einer ListView werden wiederverwendet. Wenn Sie am oberen Bildschirmrand einen Bildlauf durchführen, wird aus Performancegründen die gleiche Ansicht für den neuen Eintrag am unteren Bildschirmrand verwendet. Sie müssen die Standardfarbe in 'bindView()' explizit festlegen. –

+0

Oh, ich habe vergessen, dass Ansichten wiederverwendet werden, es funktioniert jetzt. Vielen Dank. –

0

Sie müssen prüfen, ob die percentV ist < als 41.

if (percentV >= 41 && percentV <= 70) { 
    // Orange 
    percent.setTextColor(Color.parseColor("#F58549")); 
} else if (percentV >= 71) { 
    // Green 
    percent.setTextColor(Color.parseColor("#17D11D")); 
} else { 
    // DEFAULT color (if percentV < 41) 
    percent.setTextColor(DEFAULT COLOR); 
}