做项目时用到了recyclerView,至于recyclerView是啥应该不用多解释了,具体用法也不介绍了,不懂的同学自行学习一下,网上很多大神已经介绍的很清楚了,我就不啰嗦了0.0
在使用recyclerView时遇到了一个问题,上下滑动时有时候应用会崩溃,看错误日志也只是有一个recyclerView的IndexOutOfBoundsException,全是Android底层的错误,和我们写的代码没有一点关系,关键是这个错误知识偶尔出现,刚开始不知道什么什么操作就崩了,后来发现了,只要在刷新的时候滑动就会蹦,既然知道什么情况崩了就有处下手了。
去网上搜错误原因,才知道是Android底层的一个bug,原因是在刷新数据的时候数据的list的size变为0,这时再滑动就会数组越界了,然后就崩了。我用的是Android在带的下拉刷新控件SwipeRefreshLayout,
既然是list为空后滑动导致的崩溃,那直接在刷新数据时禁止recyclerView滑动不就行了。
顺着这个思路,在SwipeRefreshLayout的下拉事件setOnRefreshListener中禁止recyclerView滑动,然后在网络请求结束后恢复滑动。
refreshLayout.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {//下拉刷新事件
@Override
public voidonRefresh() {
list_recyclerview.clear();//recycleyView 的数据list
//重写recyclerView的onTouch事件
mRecyclerView.setOnTouchListener(newView.OnTouchListener() {
@Override
public booleanonTouch(View v,MotionEvent event) {
return true;//返回true
}
});
getDataFromHttp();
}
});
privateHandlerhandler=newHandler() {
@Override
public voidhandleMessage(Message msg) {
refreshLayout.setRefreshing(false);//隐藏进度条
list_recyclerview.clear();//清空list
JSONObject json = (JSONObject) msg.obj;
list_recyclerview.addAll(news_content_jsonUtil.getList(json));//解析json数据并更新list
adapter.notifyDataSetChanged();//更新到adapter
mRecyclerView.setOnTouchListener(newView.OnTouchListener() {//恢复recyclerView的滑动事件
@Override
public booleanonTouch(View v,MotionEvent event) {
return false;
}
});
}
这样就可以解决recyclerView更新数据时滑动崩溃的问题了,网上也有很多大神给出了别的解决办法,我试过一种没起作用,可能是我用的不对,我用这种解决了0.0
我也是小菜鸟,问题产生的底层原因我也没有分析源码,这种问题还是留给Google来解决吧。