我需要在列表视图中的第n个元素之后放置一个分隔符,该分隔符是从mysqli游标生成的。我创建了尝试执行此操作的自定义适配器,如下所示:
MyAdapter extends CursorAdapter {
...
blablabla
yadayadayada
...
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final View view;
int pos = cursor.getPosition();
int beforeLast = GameData.totalPlayers-1;
if (pos == beforeLast) {
view = mInflater.inflate(R.layout.player_details_divider, parent, false);
} else {
view = mInflater.inflate(R.layout.player_details, parent, false);
}
return view;
}
}
因此,您可以看到它应该为位置totalPlayers-1上的元素夸大不同的视图。当数量足够小时,它可以很好地工作:1到6.但是当它变大时它就会停止工作。
我尝试调试这个东西,我注意到它渲染了6个项目 - 这是多少列表元素适合屏幕 - 并循环6次将pos增加到5.然后它停止。当我开始滚动列表时,它再次运行循环,将pos递增到6然后停止。无论有多少元素,它都不会将pos递增到7(尽管所有数据都存在于列表中,因此游标必须迭代到最后)。
为什么它的行为像这样?什么是我不理解/做错了?
答案 0 :(得分:1)
问题似乎是由于ListView
回收。 ListView
会尝试为项目重复使用相同的视图。因此,在您的情况下,newView
将被调用前6个可见项目,当您滚动ListView
时,会为列表中的下一个6项目调整相同的6个项目视图。
您需要更新ListView
,您有2个不同的项目视图,以便它知道您的上一个项目视图与其他项目不同
您需要override
getViewTypeCount
并返回您有2个不同的视图
@Override
public int getViewTypeCount() {
return 2; // return the view type
}
另外,override
getItemViewType
并告知ListView
last position view
是不同的。
Override
public int getItemViewType(int position){
int beforeLast = GameData.totalPlayers-1;
// return a unique number
if(beforeLast == position) {
return 1; // some unique id
}else {
return 0;
}
}