在Android中滚动时ListView项目淡出

时间:2011-11-08 14:46:40

标签: java android listview

我正在为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;
}

}

滚动前的截图:

Before Scrolling

滚动后: After Scrolling

1 个答案:

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