我有一个列表,其中我为接下来的每 5 个元素不同的 View 膨胀,并且该 View 是广告的横幅。但现在我在方法 getItemViewType()
中遇到错误。这是我的代码的样子:
@Override
public int getItemViewType(int position) {
if (jokes.get(position) != null) {
// Here i should catch every 5 element in jokes array and change view
if (position % 5 == 0 && position != 0) {
return VIEW_TYPE_BANNER;
}
return VIEW_TYPE_ITEM;
} else {
return VIEW_TYPE_LOADING;
}
}
这是方法 getItemCount()
:
@Override
public int getItemCount() {
return jokes == null ? 0 : jokes.size() + jokes.size() / 5;
}
注意:我正在从 API 获取 18 个项目。
编辑:
列表底部缺少一项。
最佳答案
我认为你应该按照以下方式做一些事情:
@Override
public int getItemViewType(int position) {
if (position % 5 == 0 && position != 0) {
return VIEW_TYPE_BANNER;
} else if (position == getItemCount() - 1) {
// Last item. Return the loading view.
return VIEW_TYPE_LOADING;
} else {
return VIEW_TYPE_ITEM;
}
}
@Override
public int getItemCount() {
return jokes == null ? 0
: jokes.size() + jokes.size() / 5 + 1;
}
请记住,当您将 VIEW_TYPE_ITEM
与位置绑定(bind)时,您不能调用 jokes.get(position)
。您需要考虑之前插入的横幅 View 。所以 jokes.get(position - numberOfBannersBeforePosition)
。
关于java - 具有多种 View 类型的 RecyclerView 适配器出现 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37220587/