java - 具有多种 View 类型的 RecyclerView 适配器出现 IndexOutOfBoundsException

标签 java android android-recyclerview

我有一个列表,其中我为接下来的每 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 个项目。

编辑:

列表底部缺少一项。

enter image description here

最佳答案

我认为你应该按照以下方式做一些事情:

@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/

相关文章:

java - Android获取移动网络频段

android - 如何在android的recyclerview中左右滑动

android - 回收者 View 中每个项目的不同项目 View

android - 如何使用 RecyclerView 创建水平 CardView,一次只在屏幕上显示一张卡片

java - 我可以对 Java 枚举使用按位或吗

java - Apache Flink 错误 java.lang.ClassNotFoundException

java mongodb 吗啡 : not contains

java - 正则表达式在一行中多次出现

Android - ICS 4.0 中的 MediaPlayer 缓冲区大小

Android 自定义首选项更改覆盖