Android

Data class + DiffUtil 이슈

그란. 2021. 3. 25. 22:25

기본적으로 코틀린의 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