2016-05-22 13 views
0

Ich verwende BaseAdapter für die Anzeige einiger Elemente.Seltsames ListAdapter Verhalten

Ich möchte den Text für Artikel an der Position Null nicht ändern.

So getView Methode meiner BaseAdapter sieht aus wie

public View getView(int position, View view, ViewGroup parent) { 
    try { 
     if(view == null) { 
      view = LayoutInflater.from(context).inflate(R.layout.item_bill, parent, false); 
     } 
     Log.e("BillAdapter", "Position :: " + position); 
     if(position == 0) { 
      Log.e("BillAdapter", "Position zero. Not changing values...."); 
     } else { 
      Bill bill = items.get(position); 
      Log.e("BillAdapter", position + " :: " + bill.toString()); 
      TextView textDate = (TextView) view.findViewById(R.id.text_date); 
      textDate.setText(bill.getDate()); 
      TextView textPaidAmount = (TextView) view.findViewById(R.id.text_paid_amount); 
      textPaidAmount.setText(String.format("%2.2f", bill.getPaidAmount())); 
     } 
    } catch (Exception ex) { 
     Log.e("BillAdpater", Log.getStackTraceString(ex)); 
    } 
    return view; 
} 

Aber meine Ausgangs

Output

ist ich die gleiche Logik in meine alle Anwendungen bin mit und es funktioniert. Ich weiß nicht, was daran falsch ist.

Es gibt den letzten Wert an der ersten Position an.

Ich habe versucht, das Projekt neu zu erstellen, reinigen Sie das Projekt, aber keinen Erfolg.

Vielen Dank im Voraus.

+0

Was möchten Sie tun, wenn 'position == 0'? –

+0

Ich möchte den Wert nicht ändern, der in 'TextView's von 'item_bill' Layoutdatei geschrieben wurde – ELITE

+1

Sie können sich nicht auf diese Logik verlassen. Sie müssen die Standardwerte für die 0-Position festlegen. –

Antwort

1

Ihr Problem ist Recycling-Mechanismus Listview. Bitte lesen Sie this, um weitere Informationen zu erhalten.

Sie Ihr Problem mit Einstelldaten in if-Anweisung lösen kann, so muss Ihr getView wie:

try { 
     if(view == null) { 
      view = LayoutInflater.from(context).inflate(R.layout.item_bill, parent, false); 
     } 
     Log.e("BillAdapter", "Position :: " + position); 
     TextView textDate = (TextView) view.findViewById(R.id.text_date); 
     TextView textPaidAmount = (TextView) view.findViewById(R.id.text_paid_amount); 

     if(position == 0) { 
      textDate.setText("Date"); 
      textPaidAmount.setText("Paid Amount"); 
     } else { 
      Bill bill = items.get(position); 
      Log.e("BillAdapter", position + " :: " + bill.toString()); 
      textDate.setText(bill.getDate()); 

      textPaidAmount.setText(String.format("%2.2f", bill.getPaidAmount())); 
     } 
    } catch (Exception ex) { 
     Log.e("BillAdpater", Log.getStackTraceString(ex)); 
    } 

, wenn Sie einen Eintrag in gesetzt, wenn Anweisung in listview Sie den Standard oder einen anderen Wert in anderen setzen, MÜSSEN Wenn Sie das nicht als Recycling-Mechanismus festlegen, ändert sich Ihr Wert nach dem Scrollen mit einer zufälligen Position.

EDIT :: Siehe Bild für ein detailliertes Verständnis

Details

es ist besser ViewHolder Muster in Ihrem Adapter Klasse zu verwenden: Sie folgenden Code verwenden können.

in getView verwenden:

try { 

     ViewHolder viewHolder; 

     if(view == null) { 
      view = LayoutInflater.from(context).inflate(R.layout.item_bill, parent, false); 
      viewHolder = new ViewHolder(); 
      viewHolder.textPaidAmount = (TextView) view.findViewById(R.id.text_paid_amount); 
      viewHolder.textDate = (TextView) view.findViewById(R.id.text_date); 

      view.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) view.getTag(); 
     } 

      Log.e("BillAdapter", "Position :: " + position); 

      if(position == 0) { 
       holder.textDate.setText("Date"); 
       holder.textPaidAmount.setText("Paid Amount"); 
      } else { 
       Bill bill = items.get(position); 
       Log.e("BillAdapter", position + " :: " + bill.toString()); 
       holder.textDate.setText(bill.getDate()); 
       holder.textPaidAmount.setText(String.format("%2.2f", bill.getPaidAmount())); 
      } 
     } catch (Exception ex) { 
      Log.e("BillAdpater", Log.getStackTraceString(ex)); 
     } 

und ViewHolder Klasse:

class ViewHolder { 
    TextView textDate; 
    TextView textPaidAmount; 
} 
+0

Vielen Dank ..Es löste mein Problem und auch ich habe die Logik dahinter, warum es den letzten Wert in der ersten Position zurückgibt ... Vielen Dank .. – ELITE

+0

Ihr Willkommen, froh zu helfen –

+0

ist es besser, ViewHolder Muster in Adapter-Klasse zu verwenden, ich werde Code bearbeiten mit ViewHolder Muster, –

0

ich auch dieses Problem konfrontiert,

In position 0 pass textView = "" 
1

Der View-Parameter ist eine wiederverwendet Instanz. Android wird aus Leistungsgründen erneut verwendet.

Sie sollten stattdessen die erwarteten Werte explizit festlegen, wenn position == 0.