본문 바로가기

개발일기

8월 한달 토이 프로젝트를 해보자! -09 : Adapter 높이 programmatically 설정해주기

다음 단계로 넘어가기 전에, 계속 거슬렸던 DiaryListBindingAdapter 의 높이를 설정해주자. 미리 말했듯, 별도의 인자를 넘기지 않고 다이렉트로 설정해주기 위해서 전역변수들을 모아 관리하는 StaticValue 클래스를 만들어주었다.

나중에 넓이값이 필요해질 수 있으니, 일단은 넓이와 높이를 모두 저장하도록 하자. 한 클래스에서 다른 클래스의 값을 다이렉트로 수정하는 것은 관심사 분리 원칙이었나...에 의해서 권장되지 않기에 별도로 만들어준다 (이러면 그런데 코틀린의 간결함을 잃는 것 아닌가? 싶기도 하다.)

StaticValue.kt

class StaticValue {

    companion object {
        var widthPixel: Int = 0
        var heightPixel: Int = 0

        fun getWidth() = widthPixel

        fun setWidth(width: Int) {
            widthPixel = width
        }

        fun getHeight() = heightPixel

        fun setHeight(height: Int) {
            heightPixel = height
        }
    }

}

다음으로, LogInFragment에서 로그인 할 때, 리스트로 넘어가기 전 높낮이를 저장하는 루틴을 추가한다.

LogInFragment.kt

private fun measureAndSetWidthAndHeight() {
    val width = Resources.getSystem().displayMetrics.widthPixels
    val height = Resources.getSystem().displayMetrics.heightPixels
    StaticValue.setWidth(width)
    StaticValue.setHeight(height)
    }

위 함수는 logInFlag를 observing 할 때, toList() 함수 호출 직전에 호출한다.

이제 어댑터에서 높이를 설정해준다. 대충... 에뮬레이터 기준 높이의 반절이면 좋을 것 같다. 아래와 같이 bind() 함수에 추가한다.

DiaryListBindingAdapter.kt

val params = itemView.layoutParams
params.height = (StaticValue.getHeight() * 0.5).toInt()
itemView.layoutParams = params

결과는 아래와 같이 높이가 조정되었다.