2012-04-03 12 views
0

私のアプリではいくつかの情報を表示し、値に応じてtextViewの色を変更します。CursorAdapter strange behavior

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

問題は、上下にスクロールして色が混ざり始めても、値が変わらないことです。

アドバイスはありますか?

編集:xmlで色を赤に設定し、必要に応じて変更します。

答えて

1

percentV < 41の場合、明示的に色を設定していません。これは、アイテムが以前にあった色を保持し、予測不可能な結果を​​もたらすことを意味します。

これは、各項目のViewがパフォーマンス上の理由から再利用される可能性があるからです。スクリーンの一番上から1つのアイテムをスクロールすると、画面の下部に表示される新しいアイテムに同じViewを使用して、毎回新しいアイテムを膨らませるコストを節約できます。明示的にデフォルトの色をbindView()に設定する必要があります。そうでない場合は、Viewには、それが含まれていた最後のアイテムの色を保持します。

+0

41以上であるかどうかを確認する必要があります。 –

+0

できません。 ListViewのビューは再利用されます。画面上部の1つの項目をスクロールすると、パフォーマンス上の理由から、画面の下部に表示される新しい項目に同じビューが使用されます。 'bindView()'にデフォルトの色を明示的に設定する必要があります。 –

+0

ああ、私はビューが再利用されていることを忘れていました。ありがとうございました。 –

0

あなたはpercentVは、私が赤にXMLで色を設定し、必要な場合にのみ変更<

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