본문 바로가기
개발/Android

[Android] ListAdapter에서 submitList()가 동작하지 않는 이유

by tempus 2022. 3. 10.
반응형

우리는 ListAdapter를 통해 효과적으로 RecyclerView의 데이터를 갱신할 수 있다. 그리고 새로운 데이터를 갱신할 때 submitList() 이용한다. 하지만 분명 데이터는 변경이 되었지만 실제적으로 RecyclerView에 갱신이 안 되는 경우가 있다. 그 이유는 submitList()를 보면 알 수 있다.

 

Why?

submitList()를 타고 가다보면 다음과 같은 코드가 있다. (AsynListDiffer.java 안에 submitList 함수)

if (newList == mList) {
    // nothing to do (Note - still had to inc generation, since may have ongoing work)
    if (commitCallback != null) {
        commitCallback.run();
    }
    return;
}

보면 java에서 ==는 주소 값을 비교한다. 즉, 새로운 리스트와 기존 리스트가 주소가 같다면 리스트의 데이터가 변경이 되어도 반영되지 않는 것을 알 수 있다. 이를 통해 우리는 새로운 주소에 있는 데이터를 넘겨주어야 한다는 것을 알 수 있다. Kotlin에서 새로운 참조를 만드는 것은 그리 어렵지 않다.

 

결론

toMutableList()는 인스턴스를 복사하여 새로운 인스턴스를 만들어 주는 함수이다. 즉 다른 주소를 갖는 데이터를 만들어준다. 이를 통해 데이터를 갱신해주면 된다.

adapter.submitList(it?.toMutableList())

 

 

반응형

댓글


loading