RecyclerView中的IndexOutOfBoundsException具有自定义布局

时间:2015-12-22 16:35:40

标签: android recycler-adapter

在我的RecyclerView中我有3种不同的自定义布局,一种是头版的标题视图,必须在位置0膨胀。第二种视图适用于必须从位置1 onwords膨胀的普通故事。第三个是打破故事的特殊布局,也应该在0以外的位置充气。

我设法在recyclelerView的onBindViewHolder()方法中执行此操作:

   public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ViewHolderHeaderMain) {
            ViewHolderHeaderMain viewHolderHeaderMain = (ViewHolderHeaderMain) holder;
            viewHolderHeaderMain.getMainHeaderView().setTopStories(this.mTopStory);
        } else if (holder instanceof ViewHolderBaisc){
            ViewHolderBaisc viewHolderItem = (ViewHolderBaisc) holder;
            viewHolderItem.bindStory(this.mStories.get(position -1));
        } else if (holder instanceof ViewHolderNew){
            ViewHolderNew viewHolderNew = (ViewHolderNew) holder;
            viewHolderNew.bindStory(this.mStories.get(position));
        }
}

然后返回视图类型,如:

 public int getItemViewType(int position) {
        if (position != 0) {
            if (mStories.get(position).getIsBreaking() ){
                return ITEM_VIEW_TYPE_CUSTOM;
            }
            return mStories.get(position) != null ? ITEM_VIEW_TYPE_BASIC : ITEM_VIEW_TYPE_FOOTER;
        }
        return 0;
    }

我的问题是,ITEM_VIEW_TYPE_BASIC视图的最后一项未显示

以下是我的getItemCount方法

 public int getItemCount() {
        return (this.mStories != null) ? this.mStories.size() : 0;
    }

如果我做return (this.mStories != null) ? this.mStories.size()+1: 0; 我得到

  

IndexOutOfBoundsException:索引10无效,大小为10

3 个答案:

答案 0 :(得分:0)

在你的getItemViewType中,你有

return mStories.get(position) 

并且在你正在进行的获取计数

return (this.mStories != null) ? this.mStories.size() : 0;

所以你想要返回this.mStories.size()+ 1,然后在你的getItemViewType中你要确保位置小于数组的大小。如果position是> = size,那么你返回FOOTER等希望这有帮助。

答案 1 :(得分:0)

您访问该项目的行:

mStories.get(position)

将抛出此异常,您传递的位置无效。相反,您应该检查位置是否小于该列表的大小。尝试添加:

if(position < mStories.size() && mStories.get(position) != null) {
   return ITEM_VIEW_TYPE_BASIC;
} else {
   return ITEM_VIEW_TYPE_FOOTER;
}

答案 2 :(得分:0)

解决我问题的唯一方法是在mStories.get(position -1)

中制作getItemViewType
if (position != 0) {
  if (mStories.get(position -1).getIsBreaking() ){
     return ITEM_VIEW_TYPE_CUSTOM;
   }
 return mStories.get(position -1) != null ? ITEM_VIEW_TYPE_BASIC : ITEM_VIEW_TYPE_FOOTER;
            }
            return 0;

现在,所有项目都会显示,并且位置已经修复。

欣赏这里给出的提示