안드로이드

RecyclerView 데이터바인딩 + ItemTouchHelper시 데이터 중복문제

코딩하는후운 2022. 2. 23. 16:15
반응형

문제 : 작업은 ViewHolder에 데이터 바인딩이 적용 되어있다.

결론은 맨 밑에 있습니다! (삽질 공유)

  1. RecyclerView에 ItemTouchHelper를 달아서 리스트 순서를 변경 하는 작업이 있다.
  2. 리스트 순서 변경시 스크롤이 빠르게 이동될 때 TextView의 Title이 중복 되어 보여졌다.

 

  • 우선, ItemTouchHelper쪽에 로그를 다 찍어보았다. (봐도 잘 모르겠음..)
  • ViewHolder쪽에 bind호출 부분 title을 로그 찍어보았지만 제대로 나오는것 같다.

고민하다가 데이터 바인딩 되어있는 부분을 ViewHolder소스에 textView.setText(title) 해보니 데이터 중복이 되지 않았다.

 

고민 : 그렇다면 소스에 setTextView하는 것과 데이터 바인딩 으로 text 처리하는게 뭐가 다른가...

 

검색

1.  뷰홀더에 setTag를 쓰면 안되는 것인가..?

https://ppost.tistory.com/entry/RecyclerView-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%BC%AC%EC%9E%84%EB%B3%B5%EC%A0%9C%EB%AD%90-%EB%93%B1%EB%93%B1%EC%9D%98-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EB%B6%88%EB%A6%AC%EB%8A%94-%EB%AC%B8%EC%A0%9C

 

RecyclerView 데이터 꼬임,복제,뭐 등등의 이름으로 불리는 문제

급한 사람들을 위해 결론부터 RecyclerView를 쓰는데 데이터 꼬임현상이 일어난다면 ViewHolder 안에서 setTag()를 안쓰면 된다! 이 글을 시작하기전에 RecyclerView에 대해 짧게 한마디만 하고 시작하겠다.

ppost.tistory.com

: 확인해보니 BindingImpl 부분 초반 소스에 textView.setTag(null)이 들어있길래 그런 문제인가 싶기도 생각함.(근데 아닌것 같음)

 

2.  데이터 바인딩 text할 때 

TextView의 경우 TextViewBindingAdapter가 참조가 되는데, 

  • 실행시 text가 아직 초기화되지 않은채로 바인딩이 되는경우(null)와 동일한 텍스트가 반복적으로 바인딩되는 경우가 있기 때문에,
    퍼포먼스 향상을 위해서 view.setText(text)가 호출되기 까지 몇개의 조건문을 통해 걸러주고 있는 모습입니다.
    바로 이점 때문입니다.
    oldText(Hello World)와 새로 들어오는 text(Hello World)가 같기 때문에 setText(text)가 호출되지 않아 렌더링 되지 않았던 것이죠.

라는 글이 있어서 이 문제인가 싶어 bindingAdapter로 forceText하도록 해보았지만 결과는 변하지 않음

https://www.charlezz.com/?p=1138 

 

DataBinding을 사용시 TextView의 텍스트가 변경되지 않는 경우 | 찰스의 안드로이드

LiveData와 DataBinding을 이용하여 동적으로 TextView의 Text를 변경하는 로직을 적용했습니다. 예를들면, "Hello World" 를 "Hello Charles"는 것과 같이 단순한 변경이였습니다. class MainViewModel: ViewModel (){ val tex

www.charlezz.com

 

3.  데이터 바인딩시 executeBindings()메서드에서 TextViewBindingAdapter의 setText()메서드를 불러서 셋팅하고 있네요! (적용)

https://yunbk.tistory.com/28

 

[Android] Databinding의 원리에 대해 알아보자

안녕하세요. 안드로이드 개발할 때 데이터 바인딩을 많이 사용하고 계실 겁니다. 이 글은 데이터 바인딩의 사용법보다는 뷰에 데이터가 어떻게 맵핑되는지를 확인하려고 합니다. 글이 너무 길

yunbk.tistory.com

: 텍스트뷰에 데이터 바인딩시,

바인딩 클래스의 executeBindings()메서드 안에서 TextView의 BindingAdapter 중 setText()메서드를 호출해서

데이터를 할당하는 것이라고 볼 수 있습니다.

 

4. executeBindings 검색

https://developer.android.com/topic/libraries/data-binding/generated-binding?hl=ko#immediate_binding
 

생성된 결합 클래스  |  Android 개발자  |  Android Developers

생성된 결합 클래스 데이터 결합 라이브러리는 레이아웃의 변수 및 뷰에 액세스하는 데 사용되는 결합 클래스를 생성합니다. 이 페이지에서는 생성된 결합 클래스를 만들고 맞춤설정하는 방법

developer.android.com

: 변수 또는 관찰 가능한 객체가 변경될 때 결합은 다음 프레임 이전에 변경되도록 예약됩니다. 하지만 결합이 즉시 실행되어야 하는 때도 있습니다. 이럴 때 강제로 실행하려면 executePendingBindings() 메서드를 사용하세요.

 

결론 : (개인의 생각)

데이터 바인딩시 변수 또는 관찰 가능한 객체가 변경될 때 결합은 다음 프레임 이전에 변경되도록 예약되는것 같다.

순서 변경하면서 변경할 때마다 bind가 잦은 호출로 인해 제대로 값이 변경되지 않은 것 같습니다.

executePendingBindings()를 이용해 즉시 실행하여 해결 or 혹은 소스에서 textView.setText() 로 바로 사용 해도 되었습니다.

 

 

 

참조 :

 

 

 

반응형