본문 바로가기

나의 플랫폼/안드로이드

[Android] Cannot call this method while RecyclerView is computing a layout or scrolling

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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


위 에러는 RecyclerView 에서 notify 관련 함수(notifyDataSetChanged, notifyItemChanged 등등)을 사용할 때 자주 발생 한다.

무슨 에러 일까....


RecyclerView 가 레이아웃을 계산 하고 있거나 스크로링 하는 동안 에는 사용 할 수 없다!


라는 문구이다. 


그래서 난 UI 쓰레드(runOnUiThread) 를 사용 하면 되나 했더니.. 그것도 안되고 에러를 품어 낸다.


결국 구글링을 열심히 해봤다. 대답은 대부분이 Handler를 만들어 post로 던져라 이다.

참고 : http://stackoverflow.com/a/32644466/3534559

        https://plus.google.com/+KayUweJanssen/posts/ApUBL2Qfbcf



즉, 완전 내가 잘못 생각 한것이었다. RecyclerView 계산과 스크롤링은 UI 스레드에서 하고 있었나 보다.

그래서 UI 쓰레드가 아닌 별도의 Runnable을 돌려 MessageQueue에 저장 하게 한 후,

RecyclerView에 연관성을 없게 하는 것이다.

(이건 제가 테스트 한 후, 생각한 결론 입니다. 다른 의견있으신 분은 언제든지 댓글 달아주세요.)


그럼 기다리시던 해결책! 아래와 같이 하세요.


        Handler handler = new Handler();

        final Runnable r = new Runnable() {
            public void run() {
                adapter.notifyDataSetChanged();
            }
        };

        handler.post(r);


handler 하나를 만드 신 후, post 함수로 호출 하게 하시면 됩니다.

참고하세요.