ListView 的Adapter刷新数据时出现IndexOutOfBoundsException: Index: 4, Size: 0 数组越界异常问题的解决方案

ListView 的notifyDataSetChanged刷新数据时出现IndexOutOfBoundsException: Index: 4, Size: 0 数组越界异常问题的解决方案

先上问题

2020-07-21 11:32:27.727 19384-19384/com.suirui.zhumu E/MessageQueue-JNI: java.lang.IndexOutOfBoundsException: Index: 4, Size: 0
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.suirui.zhumu.adapter.ScheduleListAdapter.getView(ScheduleListAdapter.java:81)
        at android.widget.AbsListView.obtainView(AbsListView.java:3271)
        at android.widget.ListView.makeAndAddView(ListView.java:2238)
        at android.widget.ListView.fillDown(ListView.java:838)
        at android.widget.ListView.fillGap(ListView.java:801)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:8315)
        at android.widget.ListView.trackMotionScroll(ListView.java:2155)
        at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:4945)
        at android.widget.AbsListView.onTouchMove(AbsListView.java:6632)
        at android.widget.AbsListView.onTouchEvent(AbsListView.java:6448)
        at android.widget.ListView.onTouchEvent(ListView.java:1721)
        at android.view.View.dispatchTouchEvent(View.java:14375)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3857)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3535)
        at android.widget.AbsListView.dispatchTouchEvent(AbsListView.java:6365)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
        at com.scwang.smartrefresh.layout.SmartRefreshLayout.dispatchTouchEvent(SmartRefreshLayout.java:1034)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)

在这里插入图片描述 首先我的listview没有设置header和footer所以不存在由header和footer导致越界异常问题。

原因分析

我的报错场景是在外层嵌套SmartRefreshLayout,在下拉刷新未完成时快速的上推加载更多出现的;
分析
我的Adapter的数据集提前被clear掉了,但是没有及时的去调用Adapter的notifyDataSetChanged()方法刷新,而是将notifyDataSetChanged()方法的调用放在了比如网络请求完成后的回调里面(会有延时),而导致你的数据集和视图不一致,产生了此异常如下图:
在这里插入图片描述

解决方案:

clear数据集后,及时调用Adapter的notifyDataSetChanged()方法,把clear的调用也放到网络请求后

总结

  1. listview设置header和footer,位置计算也要加上,否则也可能导致刷新时导致IndexOutOfBoundsException
  2. 因为是老项目的代码用中用的listview,为了性能方面考虑尽量还是用RecyclerView

猜你喜欢

转载自blog.csdn.net/weixin_37639900/article/details/107488172