2016-05-22 73 views
0

我使用BaseAdapter顯示一些項目。奇怪的ListAdapter行爲

我不想在位置零處更改項目的文本。

所以我BaseAdaptergetView方法看起來像

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; 
} 

但我的輸出是

Output

我使用的是同樣的邏輯在我所有的應用程序和它的作品。我不知道這是什麼錯誤。

它反映了第一個位置的最後一個值。

我試圖重建項目,清理項目,但沒有成功。

在此先感謝。

+0

如果位置== 0,你想要做什麼? –

+0

我不想改變從'item_bill'佈局文件中寫入'TextView'的值 – ELITE

+1

您不能依賴那個邏輯。您需要設置0位置的默認值。 –

回答

1

你的問題是ListView的回收機制。請閱讀this以獲取更多信息。

你可以在if語句設定數據解決您的問題,所以你的getView必須是這樣的:

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)); 
    } 

,當你設置如果ListView中陳述您必須設置默認的信息或其他過另一個值,如果您沒有將此設置爲回收機制,則在滾動後您的值會隨着一個隨機位置發生變化。

編輯::參考圖像詳細瞭解

Details

,最好在你的適配器類使用ViewHolder模式: 你可以用下面的代碼。

在getView

使用:

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)); 
     } 

和ViewHolder類:

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

解釋..非常感謝..它解決了我的問題,也得到了爲什麼它返回第一個位置的最後值的邏輯......非常感謝。 – ELITE

+0

歡迎您,很高興幫助 –

+0

最好在適配器類中使用ViewHolder模式,我將編輯代碼與ViewHolder模式, –

0

我也面臨這個問題,

In position 0 pass textView = "" 
1

視圖參數是重用的實例。由於性能原因,Android重用。

您應該在位置== 0時明確設置期望值。