java.lang.ArrayIndexOutOfBoundsException:length = 27;指数= -1

时间:2016-06-22 00:31:44

标签: java android

当我在回收商视图中实施页脚时,我收到此错误。

这就是我做到的。我在列表中使用了两种类型来显示不同的视图,但是在方法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 个答案:

答案 0 :(得分:2)

mUsers.get(position - 1);为0时,

position会崩溃,因为您要查找索引为-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应为20(用户大小+ 1)返回true。但是,这将返回false,因为页脚位于21位置。

因此,您有一个完全无效的地点(20)。

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

答案 1 :(得分:2)

我认为您可以修改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; 
}

答案 2 :(得分:1)

我无法确切地知道您想要做什么,但是,正如有人在我之前说的那样,错误发生在theWindow,因为它会在{{{}}搜索否定索引1}}。

所以,如果你真的需要减法,你可以这样做:

NSWindow

但是,正如您所看到的,对于mUsers.get(position - 1);,它会将相同的输出作为position == 0返回。

答案 3 :(得分:0)

我找到了一个解决方案,并且我还使用RecyclerView扩展typeview以显示一个没有项目的视图:

首先我在适配器中声明了这些变量:

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);
}