기본적으로 코틀린의 data class는 모든 속성들에 대해 equals()와 hashCode()가 정의 되어있다.
따라서 ListAdapter의 DiffUtil에서 내부적으로 객체를 비교할때
해당 속성의 값들중 하나라도 변화가 있는 경우
(문제 상황)
- EditText 에 입력하는 값 : inputText
- <EditText android:text="@{item.inputText}" />
- EditText 에 입력할때마다 onTextChanged를 받아서 리스트의 모델을 변경하는 구조
- EditText에 한글자씩 칠때마다 -> 리스트의 모델이 변경 -> inputText가 다시 적용 -> 키보드가 매번 내려감(EditText 포커스를 잃음)
(해결 방법)
equals() 와 hashCode()에서 inputText 를 지워야 한다.
inputText 를 제외하고 오버라이딩 해준다
data class UnderlineInputListUiModel(
val uuid: UUID,
val onTextChanged: (wordIndex: Int, inputText: String?) -> Unit,
val exampleText: String,
val inputText: String?,
val correctText: String,
val onFocusChanged: (Int) -> Unit
) : Identifiable {
override val identifier: Any
get() = uuid
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as UnderlineInputListUiModel
if (uuid != other.uuid) return false
if (onTextChanged != other.onTextChanged) return false
if (exampleText != other.exampleText) return false
if (correctText != other.correctText) return false
if (onFocusChanged != other.onFocusChanged) return false
return true
}
override fun hashCode(): Int {
var result = uuid.hashCode()
result = 31 * result + onTextChanged.hashCode()
result = 31 * result + exampleText.hashCode()
result = 31 * result + correctText.hashCode()
result = 31 * result + onFocusChanged.hashCode()
return result
}
}
31은 관습, (원래부터 내부적으로도 31로 되어있음)
'Android' 카테고리의 다른 글
웹뷰 스크롤 전파 (0) | 2021.04.03 |
---|---|
Map vs FlatMap (0) | 2021.04.01 |
Jetpack Navigation Component 활용하기 (0) | 2020.11.22 |
Hilt 사용법 및 Module (Binds vs Provides) 정리 및 후기 (4) | 2020.11.15 |
NaverMap API 적용하기 (3) | 2020.11.08 |