문제 : 작업은 ViewHolder에 데이터 바인딩이 적용 되어있다.
결론은 맨 밑에 있습니다! (삽질 공유)
- RecyclerView에 ItemTouchHelper를 달아서 리스트 순서를 변경 하는 작업이 있다.
- 리스트 순서 변경시 스크롤이 빠르게 이동될 때 TextView의 Title이 중복 되어 보여졌다.
- 우선, ItemTouchHelper쪽에 로그를 다 찍어보았다. (봐도 잘 모르겠음..)
- ViewHolder쪽에 bind호출 부분 title을 로그 찍어보았지만 제대로 나오는것 같다.
고민하다가 데이터 바인딩 되어있는 부분을 ViewHolder소스에 textView.setText(title) 해보니 데이터 중복이 되지 않았다.
고민 : 그렇다면 소스에 setTextView하는 것과 데이터 바인딩 으로 text 처리하는게 뭐가 다른가...
검색
1. 뷰홀더에 setTag를 쓰면 안되는 것인가..?
: 확인해보니 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
3. 데이터 바인딩시 executeBindings()메서드에서 TextViewBindingAdapter의 setText()메서드를 불러서 셋팅하고 있네요! (적용)
: 텍스트뷰에 데이터 바인딩시,
바인딩 클래스의 executeBindings()메서드 안에서 TextView의 BindingAdapter 중 setText()메서드를 호출해서
데이터를 할당하는 것이라고 볼 수 있습니다.
4. executeBindings 검색
: 변수 또는 관찰 가능한 객체가 변경될 때 결합은 다음 프레임 이전에 변경되도록 예약됩니다. 하지만 결합이 즉시 실행되어야 하는 때도 있습니다. 이럴 때 강제로 실행하려면 executePendingBindings() 메서드를 사용하세요.
결론 : (개인의 생각)
데이터 바인딩시 변수 또는 관찰 가능한 객체가 변경될 때 결합은 다음 프레임 이전에 변경되도록 예약되는것 같다.
순서 변경하면서 변경할 때마다 bind가 잦은 호출로 인해 제대로 값이 변경되지 않은 것 같습니다.
executePendingBindings()를 이용해 즉시 실행하여 해결 or 혹은 소스에서 textView.setText() 로 바로 사용 해도 되었습니다.
참조 :
- https://developer.android.com/topic/libraries/data-binding/generated-binding?hl=ko#immediate_binding
'안드로이드' 카테고리의 다른 글
Android WebView (React 서비스 화면과 통신) (0) | 2022.03.21 |
---|---|
LiveData 데이터가 100% 들어오지 않을 때 (0) | 2022.03.16 |
setOnclick, clickable의 관계 (0) | 2021.11.08 |
탭레이아웃 탭 개수가 한개일 경우 (0) | 2021.11.03 |
텍스트가 길 경우 ...붙여주며 레이아웃 반으로 줄이기 (0) | 2021.11.03 |