2015-12-22 47 views
0

在我的RecyclerView中,我有3種不同的自定義佈局,一種是頂級故事的標題視圖,必須在位置0處充氣。第二種視圖適用於需要從位置1開始膨脹的普通故事。第三個是特殊佈局用於破碎的故事,並且應在其他位置不是0在RecyclerView中使用自定義佈局的IndexOutOfBoundsException

我設法做到這一點在onBindViewHolder()方法recyclerView的膨脹:

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

+0

缺少你定義哪個持有者隨其中哪個項目類型的部分。 – njzk2

+0

但可能'viewHolderNew.bindStory(this.mStories.get(position));'應該是'position - 1' – njzk2

回答

0

在你getItemViewType,你有

return mStories.get(position) 

並在計數你是做的荷蘭國際集團

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

所以要返回this.mStories.size()+ 1,然後在getItemViewType要確保位置小於你的數組的大小。如果位置> =大小,那麼你返回FOOTER等,希望這有助於。

0

,你訪問該項目線路:

mStories.get(position) 

將拋出此異常你在一個無效的位置通過。相反,您應該檢查位置是否小於該列表的大小。嘗試添加在此:

if(position < mStories.size() && mStories.get(position) != null) { 
    return ITEM_VIEW_TYPE_BASIC; 
} else { 
    return ITEM_VIEW_TYPE_FOOTER; 
} 
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; 

現在,所有的項目都顯示和位置已定。

欣賞去這裏給出的提示