嘿大家我不是一个专业的程序员,但我一直在玩一个简单的待办事项列表来学习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);
}
}
}
答案 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