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();
}
}