youlookwhat/ByRecyclerView

有个bug

Closed this issue · 9 comments

使用 recycleview.setStateView(R.layout.statu_loading) 搭配 DiffUtil 会报错
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionSimpleViewHolder

setStateView 可以理解为一个headerView,不知道你使用addHeaderView是否会有问题。在DiffUtil 里需要使用正确的Position,应该是需要减掉 recyclerView.getCustomTopItemViewCount()。你减去这个再试试

使用addHeaderView我试了DiffUtil 没发现问题,如果你试了后还有问题的话,我改改

setStateView 可以理解为一个headerView,不知道你使用addHeaderView是否会有问题。在DiffUtil 里需要使用正确的Position,应该是需要减掉 recyclerView.getCustomTopItemViewCount()。你减去这个再试试

我在DiffUtils之前 recyclerView.isStateViewEnabled = false 写了这句的,我看源码应该是把size置为0了,理论上不应该是position的问题

/** * Get the number of StateView */ public int getStateViewSize() { return mStateViewEnabled && mStateLayout != null && mStateLayout.getChildCount() != 0 ? 1 : 0; }

setStateView 可以理解为一个headerView,不知道你使用addHeaderView是否会有问题。在DiffUtil 里需要使用正确的Position,应该是需要减掉 recyclerView.getCustomTopItemViewCount()。你减去这个再试试

事实上我打印getCustomTopItemViewCount确实也为0

setStateView将position=0位置为状态布局,使用的是SimpleViewHolder;然而DiffUtils时positin=0会是内容的adapter,这样会出现问题。看来如果要使用setStateView,一定要使用notifyDataSetChanged()。因为position的位置会变化,这种好像也是无解的。

有一种其他的方式可以解决,不过可能不太友好,就是StateView不设置为false,设置一个0高度的布局,这样position的位置也不会变。headerview因为不会消失,所以使用DiffUtils也没问题,如果消失了可能也会出现问题。

setStateView将position=0位置为状态布局,使用的是SimpleViewHolder;然而DiffUtils时positin=0会是内容的adapter,这样会出现问题。看来如果要使用setStateView,一定要使用notifyDataSetChanged()。因为position的位置会变化,这种好像也是无解的。

有一种其他的方式可以解决,不过可能不太友好,就是StateView不设置为false,设置一个0高度的布局,这样position的位置也不会变。headerview因为不会消失,所以使用DiffUtils也没问题,如果消失了可能也会出现问题。

方法一是可以的 https://www.jianshu.com/p/2eca433869e9 ,谢啦,下班

setStateView将position=0位置为状态布局,使用的是SimpleViewHolder;然而DiffUtils时positin=0会是内容的adapter,这样会出现问题。看来如果要使用setStateView,一定要使用notifyDataSetChanged()。因为position的位置会变化,这种好像也是无解的。

有一种其他的方式可以解决,不过可能不太友好,就是StateView不设置为false,设置一个0高度的布局,这样position的位置也不会变。headerview因为不会消失,所以使用DiffUtils也没问题,如果消失了可能也会出现问题。

你觉得设置为false的时候移除StateView 可不可行

可以,我尝试一下👌

    public void setStateViewEnabled(boolean stateViewEnabled, boolean isRemoveRefresh) {
        this.mStateViewEnabled = stateViewEnabled;
        if (isRemoveRefresh && !mStateViewEnabled) {
            if (mWrapAdapter != null) {
                mWrapAdapter.getOriginalAdapter().notifyItemRemoved(getPullHeaderSize() + getHeaderViewCount());
            }
        }
    }

加了一个这个方法,可以设置 setStateViewEnabled(false,true);试试,我这边还没测试diff的情况