룬아님의 취중코딩

IllegalStateException : Detected inconsistent adapter updates. 본문

개발/안드로이드 개발

IllegalStateException : Detected inconsistent adapter updates.

룬아님 2023. 4. 10. 17:04

ConcatAdapter를 사용하던 도중 다음과 같은 crash를 만났다.

원인은 간단했다.

ConcatAdapterController
    public int getLocalAdapterPosition(
            Adapter<? extends ViewHolder> adapter,
            ViewHolder viewHolder,
            int globalPosition
    ) {
        NestedAdapterWrapper wrapper = mBinderLookup.get(viewHolder);
        if (wrapper == null) {
            return NO_POSITION;
        }
        int itemsBefore = countItemsBefore(wrapper);
        // local position is globalPosition - itemsBefore
        int localPosition = globalPosition - itemsBefore;
        // Early error detection:
        int itemCount = wrapper.adapter.getItemCount();
        if (localPosition < 0 || localPosition >= itemCount) {
            throw new IllegalStateException("Detected inconsistent adapter updates. The"
                    + " local position of the view holder maps to " + localPosition + " which"
                    + " is out of bounds for the adapter with size "
                    + itemCount + "."
                    + "Make sure to immediately call notify methods in your adapter when you "
                    + "change the backing data"
                    + "viewHolder:" + viewHolder
                    + "adapter:" + adapter);
        }
        return wrapper.adapter.findRelativeAdapterPositionIn(adapter, viewHolder, localPosition);
    }

ConcatAdapterController에서 wrapper.adapter.getItemCount()로 localPosition과 비교하는 로직이 있는데

ListAdapter를 구현할 때 getItemCount를 별도 로직으로 override하여서 실제 아이템의 size와 일치하지 않았기 때문에 발생한 이슈였다.

실제 아이템의 사이즈를 이용하도록 하여 수정하였다.

    override fun getItemCount(): Int {
        return currentList.size
    }
반응형
Comments