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更新数据,都会遇到这个问题;

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