【问题标题】:ListView Footer causes ArrayIndexOutOfBoundsExceptionListView 页脚导致 ArrayIndexOutOfBoundsException
【发布时间】:2015-05-22 14:28:28
【问题描述】:

我有一个带页脚的ListView(简单的LinearLayout 有一个TextView 和一个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 以及页脚和页眉,并且在没有“增量黑客”的情况下可以正常工作。

编辑: 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);
    }

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

【问题讨论】:

  • 你能把你完整的适配器类贴在这里吗?
  • @Sajal 问题已更新

标签: java android android-listview indexoutofboundsexception baseadapter


【解决方案1】:

getViewTypeCount() 用于实例化convertViews 的数组,以getItemViewType() 的返回值作为索引,和每个数组一样,它是0-based。因此,您的getItemViewType() 无法返回大于或等于getViewTypeCount() 的值。 getViewTypeCount() == 2 唯一可能的值是 01

【讨论】:

    【解决方案2】:

    我明白了!我有:

    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,您的回答提醒我检查我的类型“索引”值。

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 1970-01-01
      • 2011-11-27
      • 2011-10-25
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多