ListView颜色问题

时间:2010-12-20 09:55:38

标签: android

嘿大家我不是一个专业的程序员,但我一直在玩一个简单的待办事项列表来学习android开发的基础知识。

我已经能够得到我想要的所有工作,但是我的列表视图有一个问题让我完全难过。我扩展了SimpleCursorAdapter以格式化来自我的sqlite数据库的数据,并根据duedate是否已过期来更改duedate文本的颜色。格式化工作完美无缺,但我的颜色有些奇怪的结果。

listview中的前几个条目看起来像我期望的那样,但是当我向下滚动时,会出现不一致的情况,其中未设置截止日期的项目将显示为红色或绿色。我在列表中向上和向下滚动越多,出现的不一致性就越多,直到最后每一行都是彩色的,无论它是否应该是彩色的。

有人可以帮我理解这里发生了什么吗?请参阅下面的自定义适配器。

public class ProAdapter2 extends SimpleCursorAdapter {
  private static int[] TO = {R.id.priority, R.id.projectname, R.id.duedate};
  private static String[] FROM = {"priorities", "projectName", "dueDate"};
  private Context context;
  private int layout;

  //constructor
  public ProAdapter2(Context context, int layout, Cursor c) {
    super(context,layout, c, FROM, TO);
    this.context=context;
    this.layout = layout;
  }    

  @Override
  public View newView(Context context, Cursor curso, ViewGroup parent){
    Cursor c = getCursor();
    final LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(layout, parent, false);
    TextView txtName = (TextView) v.findViewById(R.id.projectname);
    txtName.setText(c.getString(1));
    TextView txtPriority = (TextView) v.findViewById(R.id.priority);
    txtPriority.setText(c.getString(2));

    return v;
  }   

  @Override
  public void bindView(View v, Context context, Cursor c) {
    TextView txtDueDate = (TextView) v.findViewById(R.id.duedate);
    TextView txtDueDateLabel = (TextView) v.findViewById(R.id.duedate_label);
    TextView txtPriority = (TextView) v.findViewById(R.id.priority);
    TextView txtPriorityLabel = (TextView) v.findViewById(R.id.priority_label);
    TextView txtName = (TextView) v.findViewById(R.id.projectname);

    LinearLayout pridate = (LinearLayout) v.findViewById(R.id.pridate);

    String dueDate = c.getString(3);
    String cDate = c.getString(4);
    String dueDateFormated;

     MyTime t = new MyTime();
     Long cTimeLong = c.getLong(6);
     Long dTimeLong = c.getLong(5);

     dueDateFormated = t.getFormatedTime(c.getString(3));     
     txtDueDate.setText(dueDateFormated);

     if (c.getInt(5)==0){
        txtDueDate.setText("Not Set");
     }
     else if (cTimeLong < dTimeLong){       
         txtDueDate.setTextColor(Color.GREEN);
     }
     else if (cTimeLong > dTimeLong){
        txtDueDate.setTextColor(Color.RED);
    }
  }
}

image http://i.stack.imgur.com/bt4Z8.png

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是在txtDueDate.setText("Not Set");之后添加以下内容:

txtDueDate.setTextColor(Color.BLACK);

原因是ListView会回复您在View方法中创建的newView个对象。

因此,当调用bindView时,v参数并不总是一个闪亮的新View对象,但实际上是一个从列表顶部看不到的对象更多,以前有绿色或红色文字。

因此,您需要确保明确设置所需的所有属性,包括文本颜色。

除此之外,您还可以进行进一步的优化。例如,您不应该在setText方法中调用newView - 您应该只在绑定方法中执行此操作。

有关ListView如何运作的一些好消息,您可以观看此演讲或查看PDF幻灯片:
http://www.google.com/events/io/2010/sessions/world-of-listview-android.html