2016-06-22 82 views
0

當我在回收站視圖中實現頁腳時,出現此錯誤。java.lang.ArrayIndexOutOfBoundsException:length = 27; index = -1

這就是我已經做到的。我使用了兩種類型來顯示列表中的不同視圖,但方法getItemCount()中沒有設置好,或者當我在列表中獲取單擊的項目模型的位置時。

這是我到目前爲止有:

private final int VIEW_TYPE_ITEM = 0; 
private final int VIEW_TYPE_FOOTER = 1; 

@Override 
public int getItemCount() { 
    return mUsers == null ? 0 : mUsers.size() + 1; 
} 

@Override 
public int getItemViewType(int position) { 
    if (isFooterPosition(position)) { 
     return VIEW_TYPE_FOOTER; 
    } 
    return VIEW_TYPE_ITEM; 
} 

private boolean isFooterPosition(int position) { 
    return position == mUsers.size() + 1; 
} 

private User getUser (int position) { 
    return mUsers.get(position - 1); // Here i'm getting an error mentioned in title 
} 

編輯:

if (holder instanceof UserHolder) { 
     final User user = getUser(position); 
     UserHolder userViewHolder = (UserHolder) holder; 

     userViewHolder.tvUserName.setText(user.getName()); 
     userViewHolder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mOnItemClickListener.onItemClick(v, position); 
      } 
     }); 
    } else if (holder instanceof FooterViewHolder) { 
     FooterViewHolder footerViewHolder = (FooterViewHolder) holder; 
     Typeface typeface = Typeface.createFromAsset(mContext.getAssets(), "Lato-Thin.ttf"); 
     footerViewHolder.mButton.setTypeface(typeface); 
    } 

我有一些項目在列表正常持有者觀點和頁腳視圖一個項目。

+4

而'getUser(0)'的結果應該是什麼?順便說一句:這不看起來像一個可能的'ArrayIndexOutOfBoundsException'來源。更像是'IndexOutOfBoundsException' – Tom

+0

我已經創建了一個用於測試目的的方法,它將在列表中插入20個元素。 –

回答

2

mUsers.get(position - 1);position爲0時會崩潰,因爲您在索引-1處查找無效的項目。

如果您要添加一個頁腳,它將在所有之前的項目之後出現,那麼您是否需要進行減法?

  • 位置0 =>用戶0
  • 位置1 =>用戶1
  • 位置N =>用戶n的
  • 位置N + 1 =>頁腳

這可能是更好的僅返回mUsers.get(position)

編輯:還有一個小問題:

這裏有一個問題:

private boolean isFooterPosition(int position) { 
    return position == mUsers.size() + 1; 
} 

mUsers.size()是20,那麼用戶將有0-19位。 isFooterPosition應該返回true爲20(用戶大小+ 1)。但是,這將返回false,因爲頁腳位置爲21

因此,您有一個完全無效的點(20)。

private boolean isFooterPosition(int position) { 
    return position == mUsers.size(); 
} 
+0

如果我這樣設置,我會得到這個錯誤:'java.lang.IndexOutOfBoundsException:索引20無效,大小爲20' –

+0

我更新了我的答案,並修復了頁腳位置。 –

0

我不能看到正是你想做的事,但是,有人在我面前說,錯誤是mUsers.get(position - 1);,因爲它是因爲如果position == 0負指數會搜索。

所以,如果你真的需要減法,你可以這樣做:

private User getUser (int position) { 
    if(position != 0) 
     return mUsers.get(position - 1); 
    else 
     return mUsers.get(position); 
} 

但是,正如你所看到的,對於position == 0,它會返回相同的輸出作爲position == 1

1

我想你可以修改getUser()方法類似以下內容:

private boolean isValidPos(int position){ 
    return position >= 0 && position < mUsers.size(); 
} 

private User getUser (int position) { 
    if (isFooterPosition(position)) return null; 

    return isValidPos(position) ? mUsers.get(position) : null; 
} 
+0

這個修改給我一個錯誤:'java.lang.IndexOutOfBoundsException:索引20無效,大小爲20' –

+0

對不起,我錯過了檢查有效位置。我剛剛編輯答案 –

+0

謝謝你的麻煩,但我已經找到了解決方案。 –

0

我找到了一個解決方案,我也有一個更typeview延長RecyclerView用於顯示一個視圖在沒有項目:

首先我已經在我的適配器中聲明瞭這些變量:

public static final int COUNT_FOOTER = 1; 
public static final int COUNT_NO_ITEMS = 1; 

private final int VIEW_TYPE_ITEM = 0; 
private final int VIEW_TYPE_FOOTER = 1; 
private final int VIEW_TYPE_NO_ITEM = 2; 

之後,我定義了三種視圖類型列表:

@Override 
    public int getItemViewType(int position) { 
     if (!mUsers.isEmpty()) { 
      if (position < mUsers.size()) { 
       return VIEW_TYPE_ITEM; 
      } else { 
       return VIEW_TYPE_FOOTER; 
      } 
     } else { 
      if (position == 0) { 
       return VIEW_TYPE_NO_ITEM; 
      } else { 
       return VIEW_TYPE_FOOTER; 
      } 
     } 
    } 

@Override 
public int getItemCount() { 
    if (!mUsers.isEmpty()) { 
     return mUsers.size() + COUNT_FOOTER; 
    } else { 
     return COUNT_NO_ITEMS + COUNT_FOOTER; 
    } 
} 

private User getUser (int position) { 
    return mUsers.get(position); 
} 
相關問題