-
BindingAdapter에서 margin 설정하기Android 2020. 9. 24. 14:26반응형
리사이클러 뷰를 사용하다보면 아이템마다 다르게 margin값을 설정해야 할 때가 있다.
그럴때 BindingAdapter를 사용하여 margin을 설정해줄 수 있다.
data class TextData( override val marginStart: Int, override val marginEnd: Int, override val marginTop: Int, override val marginBottom: Int ) : BaseTextData
margin만 설명을 하자면 Data 클래스에 아이템별로 margin 값을 담아놔준다.
(text 나 size등을 설정 할때도 동일하다.)
val Int.dp: Int get() { val metrics = Resources.getSystem().displayMetrics return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), metrics) .toInt() }
Int로 저장했기때문에 dp로 변환 과정이 필요하다.
확장 프로퍼티를 사용하여 Int에서 dp로 변환할 수 있게 해주자
@BindingAdapter("bind:layoutMarginStart") fun View.layoutMarginStart(margin: Int) { if (margin != 0) { val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams layoutParams.marginStart = margin.dp this.layoutParams = layoutParams } } @BindingAdapter("bind:layoutMarginEnd") fun View.layoutMarginEnd(margin: Int) { if (margin != 0) { val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams layoutParams.marginEnd = margin.dp this.layoutParams = layoutParams } } @BindingAdapter("bind:layoutMarginTop") fun View.layoutMarginTop(margin: Int) { if (margin != 0) { val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams layoutParams.topMargin = margin.dp this.layoutParams = layoutParams } } @BindingAdapter("bind:layoutMarginBottom") fun View.layoutMarginBottom(margin: Int) { if (margin != 0) { val layoutParams = this.layoutParams as ViewGroup.MarginLayoutParams layoutParams.bottomMargin = margin.dp this.layoutParams = layoutParams } }
그런 다음 BindingAdapter에 위치에 따른 margin을 구현해준다.
위에 코드 같은경우는 margin 기본값을 0으로 설정해뒀기 때문에 if문을 사용해서 제외시켜줬다.
bind:layoutMarginStart="@{item.marginStart}" bind:layoutMarginEnd="@{item.marginEnd}" bind:layoutMarginTop="@{item.marginTop}" bind:layoutMarginBottom="@{item.marginBottom}"
그런 다음 원하는 View에다가 item에 담긴 margin값을 넣어주면된다.
반응형'Android' 카테고리의 다른 글
[Android] 카카오 로그인 v2 API with kotlin - 1 (0) 2020.10.16 Fragment 통신 (setTargetFragment, Listener) (0) 2020.10.07 [Android] Task (0) 2020.09.02 Koin 입문기 (0) 2020.09.02 Dialog Fragment round corners (0) 2020.09.02