gpt4 book ai didi

java - Android ListView - 第 n 个元素后的分隔线

转载 作者:行者123 更新时间:2023-11-30 02:54:54 27 4
gpt4 key购买 nike

我需要在从 mysqli 游标生成的 ListView 中的第 n 个元素之后放置一个分隔符。我创建了尝试这样做的自定义适配器,如下所示:

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 上的元素膨胀不同的 View 。当数字足够小时效果很好:1 到 6。但是当它更大时它就会停止工作。

我尝试调试这个东西,我注意到它呈现了 6 个项目——这是屏幕上适合的列表元素的数量——并通过循环 6 次递增 pos 到 5。然后它停止了。当我开始滚动列表时,它再次运行循环,将 pos 递增到 6,然后停止。无论有多少元素,它都不会将 pos 递增到 7(尽管所有数据都存在于列表中,因此游标必须迭代到末尾)。

知道为什么它会这样吗?我不理解/做错了什么?

最佳答案

问题似乎是由于 ListView 回收造成的。 ListView 将尝试为项目重用相同的 View 。因此,在您的情况下,newView 会为前 6 个可见项目调用,当您滚动 ListView 时,会为列表中的下 6 个项目调整相同的 6 个项目 View 的大小。

您需要更新 ListView,您有 2 个不同的项目 View ,以便它知道您的最后一个项目 View 与其他 View 不同

您需要覆盖 getViewTypeCount 并返回您有 2 个不同的 View

@Override
public int getViewTypeCount() {
return 2; // return the view type
}

此外,覆盖 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;
}
}

关于java - Android ListView - 第 n 个元素后的分隔线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23451050/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com