CursorAdapter奇怪的行为

时间:2012-04-03 15:36:58

标签: java android listview cursor android-cursoradapter

在我的应用程序中,我会显示一些信息,并根据值更改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 个答案:

答案 0 :(得分:1)

如果percentV < 41,您没有明确设置颜色。这意味着该项目将保留以前视图的任何颜色,从而产生不可预测的结果。

这是因为出于性能原因,每个项目的View可能会被重复使用。如果您从屏幕顶部滚动一个项目,则可以将相同的View用于显示在屏幕底部的新项目,以节省每次膨胀新项目的成本。您必须在bindView()中明确设置默认颜色,否则View将保留其包含的最后一个项目的颜色。

答案 1 :(得分:0)

您必须检查百分比是否为&lt;比41岁。

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