2016-05-22 13 views
0

私はBaseAdapterを使っていくつかの項目を表示しています。Strange ListAdapterの動作

私は位置0のアイテムのテキストを変更したくありません。

だから私の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

'position == 0'なら何をしたいですか? –

+0

'TextView'sで書かれた値を' item_bill'レイアウトファイル – ELITE

+1

から変更したいのですが、そのロジックに頼ることはできません。 0の位置のデフォルト値を設定する必要があります。 –

答えて

1

あなたの問題は、リストビューのリサイクルメカニズムです。詳細はthisをお読みください。

あなたのgetViewメソッドは次のようでなければならないので、あなたは、if文でデータを設定して、あなたの問題を解決することができます:あなたはリストビューでif文で1つの情報を設定するときは、あまりにも他にデフォルトまたは別の値を設定しなければなりません

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

リサイクル機構が起こったときに値を変更しないと、スクロール後に値がランダムに変わります。

EDIT ::詳細に理解するために、画像を参照してください

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

Viewパラメーターを再利用インスタンスです。 Androidはパフォーマンス上の理由から再利用されます。

代わりに、position == 0のときに期待値を明示的に設定する必要があります。