1. 程式人生 > >解決Recyclerview重新整理資料時滑動介面造成的奔潰。

解決Recyclerview重新整理資料時滑動介面造成的奔潰。

錯誤提示:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{775cd18 position=2 id=2, oldPos=-1, pLpos:-1 no parent}
在這裡插入圖片描述

2,錯誤分析:

當資料列表清空的時候,這時候item也沒有對應的資料,當你再滑動時由於匹配不到對應的資料所以就GG,而且並不指示是哪個地方出錯,應該是recyclerview內部處理問題。

3,解決方法:

第一種

可以在初始化的時候對recyclerView的觸控進行監聽,當處於資料更新狀態時就設定成不可滑動,更新完成則設定成可滑動,程式碼如下:

 recyclerView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    if (mIsRefreshing) {
                        return true;
                    } else {
                        return false;
                    }
    
                }
            });

mIsRefreshing為狀態值 true 不能滑動 false能滑動

  xRefreshView.setOnRefreshLoadmoreListener(new OnRefreshLoadmoreListener() {

            @Override
            public void onLoadmore(RefreshLayout refreshLayout) {
                mIsRefreshing = true;
                if (dates1 - dates >= 0) {
                    dates += 1;
                    presenter.getYouhuijuanData();
                } else {
                    xRefreshView.finishLoadmore();
                }
            }

            @Override
            public void onRefresh(RefreshLayout refreshLayout) {
                mIsRefreshing = true;
                dates -= 1;
                presenter.getYouhuijuanData();
            }
        });

當重新整理時讓mIsRefreshing的狀態為true 使recyclerView不返回觸控事件,這樣就能避免奔潰事件的產生啦。

第二種

新建一個類去繼承LinearLayoutManager,然後去重寫他的onLayoutChildren()方法

 @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        try {
            super.onLayoutChildren(recycler, state);
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
        }
    }