2012-04-03 6 views
0

내 응용 프로그램에서 일부 정보를 표시하고 값에 따라 textView의 색을 변경합니다.CursorAdapter 이상한 동작

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은 성능상의 이유로 다시 사용할 수 있기 때문입니다. 한 항목을 화면 상단에서 스크롤하면 화면 하단에 나타나는 새 항목에 동일한 View을 사용하여 매번 새 항목을 부 풀리는 비용을 절약 할 수 있습니다. 명시 적으로 기본 색상을 bindView()에 설정해야합니다. 그렇지 않으면 View은 포함 된 마지막 항목의 색상을 그대로 유지합니다.

+0

(41)보다 있는지 확인해야합니다. –

+0

그럴 수 없습니다. ListView의 뷰가 재사용됩니다. 화면 상단의 한 항목을 스크롤하면 성능상의 이유로 동일한 화면이 화면 하단에 나타나는 새 항목에 사용됩니다. '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); 
}