我有一个奇怪的问题,我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 的实现可能有什么问题?