您的位置:首页 > 移动开发 > Android开发

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 就可以了;

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息