Android - 实现下拉刷新 和 RecyclerView Bug
2015-10-28 21:48
295 查看
1. RecyclerView Bug
异常: IndexOutOfBoundsException: Inconsistency detected. Invalid item position
成因 : 使用 RecyclerView 加官方下拉刷新的时候,如果绑定的 List 对象在更新数据之前进行了 clear,而这时用户紧接着迅速上滑 RV,就会造成崩溃,而且异常不会报到你的代码上,属于RV内部错误。初次猜测是,当你 clear 了 list 之后,这时迅速上滑,而新数据还没到来,导致 RV 要更新加载下面的 Item 时候,找不到数据源了,造成 crash.
解决 :在刷新,也就是 clear 的同时,让 RecyclerView 暂时不能够滑动,之后再允许滑动即可。代码就是在 RecyclerView 初始化的时候加上是否在刷新进而拦截手势:
mIsRefreshing 是boolean 值, 刷新时改变其状态false 就可以了;
如果实现adapter更新数据,都会遇到这个问题;
原文地址:http://drakeet.me/recyclerview-bug-indexoutofboundsexception-inconsistency-detected-invalid-item-position-solution
2.下拉刷新实现
谷歌官方提供的下拉刷新 : android.support.v4.widget.SwipeRefreshLayout ;
很漂亮,自己可以试试;
实现步骤 :
(1) 布局实现
(2) 初始化
(3) 设置和控制实现
这里的swifRefushListener 是 进度条OnRefreshListener 对象
(4) 进度条监听事件实现
异常: IndexOutOfBoundsException: Inconsistency detected. Invalid item position
成因 : 使用 RecyclerView 加官方下拉刷新的时候,如果绑定的 List 对象在更新数据之前进行了 clear,而这时用户紧接着迅速上滑 RV,就会造成崩溃,而且异常不会报到你的代码上,属于RV内部错误。初次猜测是,当你 clear 了 list 之后,这时迅速上滑,而新数据还没到来,导致 RV 要更新加载下面的 Item 时候,找不到数据源了,造成 crash.
解决 :在刷新,也就是 clear 的同时,让 RecyclerView 暂时不能够滑动,之后再允许滑动即可。代码就是在 RecyclerView 初始化的时候加上是否在刷新进而拦截手势:
mIsRefreshing 是boolean 值, 刷新时改变其状态false 就可以了;
mRecyclerView.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mIsRefreshing) { return true; } else { return false; } } } );
如果实现adapter更新数据,都会遇到这个问题;
原文地址:http://drakeet.me/recyclerview-bug-indexoutofboundsexception-inconsistency-detected-invalid-item-position-solution
2.下拉刷新实现
谷歌官方提供的下拉刷新 : android.support.v4.widget.SwipeRefreshLayout ;
很漂亮,自己可以试试;
实现步骤 :
(1) 布局实现
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swiperefresh_wei" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout>
(2) 初始化
SwipeRefreshLayout swiperefresh_wei = (SwipeRefreshLayout) view.findViewById(R.id.swiperefresh_wei);
(3) 设置和控制实现
这里的swifRefushListener 是 进度条OnRefreshListener 对象
/** * 3.进度条实现 */ //设置进度条颜色 swiperefresh_wei.setColorSchemeResources(R.color.zhu_color, R.color.zhushen_color , R.color.fu_color, R.color.black_overlay); swiperefresh_wei.setSize(SwipeRefreshLayout.LARGE); //设置进度条的位置 swiperefresh_wei.setProgressViewEndTarget(true, 800); //设置监听 swiperefresh_wei.setOnRefreshListener(swifRefushListener); //设置启动后就进行刷新 swiperefresh_wei.post(new Runnable() { @Override public void run() { swiperefresh_wei.setRefreshing(true); } }); swifRefushListener.onRefresh();
(4) 进度条监听事件实现
/** * 1.下拉刷新监听 * 下拉刷新 */ class SwifRefushListener implements SwipeRefreshLayout.OnRefreshListener { @Override public void onRefresh() { mIsRefreshing=false; onePageAccess(); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories