CursorAdapter странное поведение - PullRequest
0 голосов
/ 03 апреля 2012

В моем приложении я показываю некоторую информацию и в зависимости от значения меняю цвет textView.

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 я устанавливаю красный цвет и меняю только при необходимости.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Вы явно не устанавливаете цвет, если percentV < 41. Это означает, что элемент сохранит любой цвет, который имел вид ранее, давая непредсказуемые результаты.

Это потому, что каждый элемент View может быть повторно использован по соображениям производительности. Если вы прокручиваете один элемент за верхнюю часть экрана, то же самое значение View можно использовать для нового элемента, появляющегося в нижней части экрана, чтобы сэкономить на стоимости раздувания нового элемента каждый раз. Вы должны явно установить цвет по умолчанию в bindView(), иначе View сохранит любой цвет, который он имел для последнего содержащегося в нем элемента.

0 голосов
/ 03 апреля 2012

Вы должны проверить, если процент V <41. </p>

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