이렇게 저렇게 RecyclerView 를 만지다가
data binding item 표현을 좀 더 깔끔하게 표현해보려고 자꾸 손대다가 문제 발생.
문제 현상
- RecyclerView scoll시 특정 item이 foreground 상황에서 계속 변경됨
디버깅 해보니 문제되는 item의 adapter position이 말도 안되는 값으로 계속 설정 된다.
그렇다고 재사용을 막아버릴 순 없고.
삽질에 삽질을 거듭하다보니
private lateinit var binding: ListItemBinding
class CoffeeViewHolder(binding: ListItemBinding) : ViewHolder(binding.root)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CoffeeViewHolder {
binding = ListItemBinding.inflate(LayoutInflater.from(parent.context), parent,false)
return CoffeeViewHolder(binding)
}
override fun onBindViewHolder(holder: CoffeeViewHolder, position: Int) {
binding.run...
.....
class CoffeeViewHolder(itemView: View) : ViewHolder(itemView) {
val binding = DataBindingUtil.bind<ListItemBinding>(itemView)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CoffeeViewHolder =
CoffeeViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false))
override fun onBindViewHolder(holder: CoffeeViewHolder, position: Int) {
holder.binding?.let {
...
data binding 쓰면서 늘 그냥 위(해결코드)처럼 썼는데
layout xml 파일명을 굳이 쓰고 싶지 않아서 스타일만 바꿔보리라 생각한 것이었는데
이렇게 될 줄이야...
결국 RecyclerView 재사용은 현재 화면에 얼마나 보이는지,
재사용 가능한 아이템의 position 이 어딘지 알기 위해 실제 load된 view와 전체 화면 크기를 계산하는 것일텐데
이 지점에서 전역변수로 사용하게 된 것이 방해가 되었던 것이리라.
자세한 code digging은 TBD (ㅋㅋ)
??? : RecyclerView 언제 좀 정복할 수 있니...?
(DataBinding) 여러 화면에서 BindingAdapter 사용 주의점 (0) | 2023.04.20 |
---|---|
Fragment간 ViewModel 공유하기 - ktx fragment (0) | 2023.04.19 |
(간단앱만들기-1) MVVM(data-bidning) + Retrofit + Room + Coroutine(Kotlin) + RecyclerView (0) | 2023.04.09 |
java 고인물이 kotlin 시작하는 방법 (0) | 2023.04.05 |
댓글 영역