0

我有一个奇怪的问题,我ListView将正确显示最初创建视图时填充的列表项,但是当我开始滚动时,某些项目的位置会发生变化,并且不会反映它们在列表中的位置。

这是我的代码:

private class CustomCursorAdapter extends CursorAdapter {

    LayoutInflater mInflater;

    public CustomCursorAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);
        this.mContext = context;

        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @SuppressWarnings("static-access")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.assignment_list_item, parent, false);
            holder = new ViewHolder();
            holder.colorStrip = (ColorStrip) convertView.findViewById(R.id.assignment_list_color_strip);
            holder.titleLabel = (TextView) convertView.findViewById(R.id.list_title);
            holder.descriptionLabel = (TextView) convertView.findViewById(R.id.list_description);
            holder.dueLabel = (TextView) convertView.findViewById(R.id.list_due);

            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();

        assignmentsCursor.moveToPosition(position);
        String title = assignmentsCursor.getString(1);
        short course = assignmentsCursor.getShort(2);
        String desc = assignmentsCursor.getString(3);
        long due = assignmentsCursor.getLong(4);

        holder.titleLabel.setText("Pos: " + position + " | " + title);
        holder.colorStrip.setColor(colors.get(course));
        convertView.setBackgroundColor(colorsLight.get(course));
        String dueString = getDateString(due);
        holder.dueLabel.setText(dueString);
        holder.descriptionLabel.setText(desc);

        return convertView;
    }

    @Override
    public void bindView(View arg0, Context arg1, Cursor arg2) {}

    @Override
    public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { return null; }

    @Override
    public boolean hasStableIds() { return true; }

    @Override
    public int getViewTypeCount() { return 2; }
}

您可以在这里看到我的问题的视频:http: //youtu.be/KzyTLSsDeJk在视频中,您可以看到位置 7 的列表项在我滚动时正在更改一堆,然后列表似乎在 0 处重新开始在项目编号 8 上。ListView应该显示的是“Pos: 0”、“Pos: 1”...“Pos: 8”、“Pos: 9”等等。

从第 8 位到列表末尾,颜色也很混乱。背景颜色总是应该是沿列表项左侧的条带的较浅版本。

编辑: 在视频中,您可以看到 getView 被传递的位置(反映在每个列表项的标题 TextView 中)在最初可见的内容结束时都很好(通过“Pos:6 | ...”)在屏幕上(不滚动),但是一旦我向下滚动,接下来出现的所有内容都会一团糟。

这是每个列表项中第一个 TextView 的表示(括号中是我的评论):

职位:0 | 阅读第 1 章(好)
Pos: 1 | 填写知识框(好)
职位:2 | 第 1 章论文(好)
位置:4 | 阅读第 2 章(好)
Pos: 5 | 在活页夹里放更多的纸(好)
位置:6 | 做第 1 课(好)
位置:## | [滚动时变化](从位置正确开始:7,但随着我滚动的更多,它会发生巨大变化)
位置:0 | 阅读第 1 章(应为 Pos: 8)
Pos: 1 | 填写知识框(应为职位:9)

Pos:## 是最初只是在屏幕外的项目,但是当我滚动时位置编号会发生变化(参见视频)。

编辑 2:这是我的 ViewHolder 类:

private static class ViewHolder {
    private static ColorStrip colorStrip;
    private static TextView titleLabel;
    private static TextView descriptionLabel;
    private static TextView dueLabel;

    public ViewHolder() {}
}

编辑3:只是为了好玩,我停止使用我的ViewHolder(并且每次都使用运行findViewById()的低效方法)并且我的问题都消失了。所有的 TextView 都被分配了适当的值,而且颜色看起来也不错。任何想法我的 ViewHolder 的实现可能有什么问题?

4

3 回答 3

0

可能是因为您没有CursorAdapter按照应有的方式使用。在CursorAdapter您必须膨胀内部视图newView()并返回view将传递bindView()给以将视图与游标中的数据绑定的视图。您可以从此处查看演示项目。以确保您可以如何实现您的CursorAdapter. 您也可以查看许多教程CursorAdapter,其中之一就是这个

于 2012-10-16T05:40:34.703 回答
0

我认为要分配光标值,您应该使用 bindView() 和 newView() 方法而不是 getView()。

于 2012-10-14T20:58:05.703 回答
-1

像这样从 getView() 方法中删除 if 条件。

 public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;


        convertView = mInflater.inflate(R.layout.assignment_list_item, parent, false);
        holder = new ViewHolder();
        holder.colorStrip = (ColorStrip) convertView.findViewById(R.id.assignment_list_color_strip);
        holder.titleLabel = (TextView) convertView.findViewById(R.id.list_title);
        holder.descriptionLabel = (TextView) convertView.findViewById(R.id.list_description);
        holder.dueLabel = (TextView) convertView.findViewById(R.id.list_due);

        convertView.setTag(holder);

    assignmentsCursor.moveToPosition(position);
    String title = assignmentsCursor.getString(1);
    short course = assignmentsCursor.getShort(2);
    String desc = assignmentsCursor.getString(3);
    long due = assignmentsCursor.getLong(4);

    holder.titleLabel.setText("Pos: " + position + " | " + title);
    holder.colorStrip.setColor(colors.get(course));
    convertView.setBackgroundColor(colorsLight.get(course));
    String dueString = getDateString(due);
    holder.dueLabel.setText(dueString);
    holder.descriptionLabel.setText(desc);

    return convertView;
}
于 2012-10-15T04:27:12.603 回答