IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling

 java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
        at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2575)
        at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:4932)
        at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11359)
        at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:6636)
        at adapter.PersonQJApplayReasonAdapter$1.onCheckedChanged(PersonQJApplayReasonAdapter.java:63)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:154)
        at adapter.PersonQJApplayReasonAdapter.onBindViewHolder(PersonQJApplayReasonAdapter.java:45)
        at adapter.PersonQJApplayReasonAdapter.onBindViewHolder(PersonQJApplayReasonAdapter.java:19)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6356)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6389)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5335)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5598)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583)
        at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3025)
        at android.view.View.measure(View.java:17682)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1083)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:615)
        at android.view.View.measure(View.java:17682)
        at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1063)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:615)
        at android.view.View.measure(View.java:17682)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17682)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17682)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:438)
        at android.view.View.measure(View.java:17682)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:438)
        at android.view.View.measure(View.java:17682)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17682)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17682)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:438)
        at android.view.View.measure(View.java:17682)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android

出现这样的错误最主要的原因是因为 我在adapter里面进行了监听和回调,但是在他的渲染还没有完成之前就进行了notifyDataSetChanged,也就是说在view滑动和计算布局的时候notifyDataSetChanged是不可用的

修订前的代码:

holder.radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            onItemCheckedListener.onChecked(holder.itemView,position);//fragment里面的点击回调事件,fragment里面对adapter的position进行了更新,所以会重新计算布局
                index = position;
                notifyDataSetChanged();
            }
        }
});

修订后的:

holder.radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            onItemCheckedListener.onChecked(holder.itemView,position);
            if (index!=position){
                index = position;
                notifyDataSetChanged();
            }
        }
    }
});

猜你喜欢

转载自blog.csdn.net/dream_miracle/article/details/82344259