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的调用也放到网络请求后
总结
- listview设置header和footer,位置计算也要加上,否则也可能导致刷新时导致
IndexOutOfBoundsException
- 因为是老项目的代码用中用的
listview
,为了性能方面考虑尽量还是用RecyclerView
,