ListView 页脚导致 ArrayIndexOutOfBoundsException

ListView Footer causes ArrayIndexOutOfBoundsException

我有一个带页脚的 ListView(简单的 LinearLayoutTextView 和一个 ImageView),还有一个 BaseAdapter 带 2 View 类型:

@Override
public int getViewTypeCount() {
    return 2;
}

我的问题是当我将列表滚动到底部并到达页脚时,因为抛出了这个异常:

java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
            at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6444)
            at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4993)
            at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4197)
...

如果我将 getViewTypeCount() 增加到 3,一切正常。
这是我第一次遇到这个错误,在其他项目中我有 BaseAdapters 更多的 ViewTypes 和页脚和页眉,它在没有 "increment hack" 的情况下工作正常。

编辑: BaseAdapter 代码:

    @Override
    public int getCount() {
        return mItemsList.size();
    }

    @Override
    public Object getItem(int position) {
        return mItemsList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        if (mItemsList.get(position).getValue().equals(mContext.getString(R.string.stub))) {
            return STUB;
        }
        return ITEM;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (getItemViewType(position) == ITEM) {
            return itemView(position, convertView);
        }
        return stubView(convertView);
    }

我在这里错过了什么?
谢谢。

getViewTypeCount() 用于实例化 convertView 的数组,由 getItemViewType() 的 returned 值索引,并且像每个数组一样,它是 0-based。因此,您的 getItemViewType() 不能 return 大于或等于 getViewTypeCount() 的值。 getViewTypeCount() == 2 唯一可能的值是 01

我知道了!我有:

private static final int ITEM = 1;
private static final int STUB = 2;

而不是

private static final int ITEM = 0;
private static final int STUB = 1;

谢谢@Blackbelt,你的回答提醒我检查我的类型 "index" 值。