Android ListView addScrapView ArrayIndexOutOfBoundsException

使用ListView自定义Adapter时出现ArrayIndexOutOfBoundsException错误:

java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
    at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:5996)
    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4554)
    at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:3874)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)

CustomAdapter 的 getViewTypeCount() 方法返回值为2,表示ListView中有两种不同的视图,getItemViewType() 的返回值分别为1或2,取决于item在ListView中的位置。getItemViewType() 的返回值应该是从下标0开始的,所以应该返回0或者1。

解决办法:

static final int COMMON_ITEM = 0;
static final int CLEAR_ITEM = 1;

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

@Override
public int getItemViewType(int position) {
    if (position != historyKey.length) {
        return COMMON_ITEM;
    } else {
        return CLEAR_ITEM;
    }
}

将getItemViewType() 的返回值改为 0或者1,运行不报错了,问题解决啦!

最后总结一点是:Adapter的getViewTypeCount 方法和getItemViewType方法返回值之间存在一定的关系。如果getViewTypeCount 返回值为 3,那么getItemViewType方法的返回值应该是 0、1、2,不能超过2,否则会出现ArrayIndexOutOfBoundsException异常。

上一篇 Android如何区分debug和release两种状态
下一篇 Android添加第三方so库的简单配置
目录
文章列表
1 MathJax基础之连续分式
MathJax基础之连续分式
2
微信小程序异步与同步获取本地缓存及其调用注意
微信小程序异步与同步获取本地缓存及其调用注意
3
CryptoJS中WordArray
CryptoJS中WordArray
4
实现一个Spring Boot Starter入门
实现一个Spring Boot Starter入门
5
Java后台管理站框架
Java后台管理站框架
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。