我正在为Android开发,我有一个应用程序(称为Forget-Me-Not),它使用ListView
作为任务屏幕(它是一个待办事项列表应用程序)。我完成后将项目设置为灰色。
当列表大于屏幕时,滚动照常进行。但问题是当向上/向下滚动并再次返回时,未完成的项目也会变灰。我已经检查了很多次,灰色似乎是随机的。这些项目是可点击的,它们按预期运行(即长按等)。唯一的问题是灰暗。 (这会使用户感到困惑,因为此应用程序是ToDo列表管理应用程序,而灰色处理是“完成”任务)。
我不知道要发布什么代码,所以如果有人能告诉我我应该发布什么代码或者可以直接给出答案,我会非常感激。
PS:我有一个自定义的ListAdapter类。它主要从SQLite数据库中读取项目并将它们设置为适配器。你可以在我的应用程序中看到Android市场中的错误(Forget-Me-Not)。
编辑: 这是我的自定义TaskAdapter类:
public class TasksAdapter extends BaseAdapter {
private String[] items;
private int[] priorities;
private Vector<String> completed;
private Context context;
public TasksAdapter(TasksActivity context, int textViewResourceId, String[] items) {
if(items != null)
this.items = items;
else
this.items = new String[0];
this.priorities = new int[this.items.length];
for(int i = 0; i < this.priorities.length; i++) {
this.priorities[i] = FMN.PRIORITY_LOW;
}
this.completed = new Vector<String>(0);
this.context = context;
}
public TasksAdapter(TasksActivity context, int textViewResourceId, String[] items, int[] priorities, Vector<String> completed) {
if(items != null)
this.items = items;
else
this.items = new String[0];
if(priorities != null)
this.priorities = priorities;
else {
this.priorities = new int[this.items.length];
for(int i = 0; i < this.priorities.length; i++) {
this.priorities[i] = FMN.PRIORITY_LOW;
}
}
if(completed != null)
this.completed = completed;
else
this.completed = new Vector<String>(0);
this.context = context;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.task_item, null);
}
TextView task = (TextView) v.findViewById(R.id.tv_task);
task.setText(items[position]);
ImageView prio = (ImageView) v.findViewById(R.id.im_task_priority);
switch(priorities[position]) {
case FMN.PRIORITY_HIGH:
prio.setImageResource(R.drawable.fmn_priority_high);
break;
case FMN.PRIORITY_MEDIUM:
prio.setImageResource(R.drawable.fmn_priority_low);
break;
case FMN.PRIORITY_LOW:
prio.setImageResource(R.drawable.fmn_priority_medium);
break;
default:
prio.setImageResource(R.drawable.fmn_priority_medium);
break;
}
if((completed.size() != 0) && (completed.contains(task.getText()))) {
task.setTextColor(Color.rgb(155, 175, 155));
}
return v;
}
public int getCount() {
return items.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
}
滚动前的截图:
滚动后:
答案 0 :(得分:4)
这可能是ListAdapter getView中的一个错误。你回收列表对象/项目了吗?回收时,颜色的属性等将保留在对象上。确保根据任务所处的状态设置属性是正确的。
在getView函数中,您可能会检查是否已设置了view-item allready,然后您只需更改项目上任务的文本(回收)?在代码中的相同位置将背景的颜色设置更改为正确的任务状态。
EDIT 现在我看到你的代码看起来好像已经混淆了优先级,默认值和优先级低将背景设置为prio.setImageResource(R.drawable.fmn_priority_medium); 和medium将背景设置为prio.setImageResource(R.drawable.fmn_priority_low);
好的,我发现了问题:
if((completed.size() != 0) && (completed.contains(task.getText()))) {
task.setTextColor(Color.rgb(155, 175, 155));
}
如果未完成,您需要在此处使用else语句将文本颜色设置为原始颜色。像:
if((completed.size() != 0) && (completed.contains(task.getText()))) {
task.setTextColor(Color.rgb(155, 175, 155));
} else {
task.setTextColor(Color.rgb(0, 0, 0));
}