ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • item decoration
    개발/안드로이드 2020. 12. 6. 14:25

    recycler view를 사용할 때 item 간의 간격을 다르게 주고 싶을 때가 있다. 예를 들어 a타입과 b타입의 아이템 사이의 간격은 상하 10dp, b타입과 c타입의 간격은 상하 5dp 이런식으로 설정하거나 더 보편적으로는 마지막 아이템인 경우에는 간격을 좀 더 띄워서 넣으려고 하는 경우가 있다. 이때 가장 빠르게 떠오르는 방법은 recyclerview의 adapter에서 position별로 margin을 주는 경우인데 이렇게 하면 안된다. recyclerview에서 자체적으로 position을 관리하기 때문에 내가 보고 있는 recyclerview에서 관리하고 있는 position이 다르다. 그래서 나는 분명히 제대로 준것 같은데 실제로 보면 다른 item에 margin이 들어간다. 이 부분이 크게 눈에 띄지 않는 부분이라 잘못 짜두고도 눈치채기가 어려워 종종 그냥 넘어가는데 나중에 디버깅해보면 item간의 간격이 내가 의도한 것과 다르게 표시된다. 그것도 아주 보기 싫게.

     

    item간의 간격을 dynamic하게 조절할 때는 recycler view에서 관리하는 item decoration 라이브러리를 사용해야한다. 여기서 넘어오는 view는 recycler view에서 관리하고 있는 현재 item의 view다. 이 인자와 getChildAdapterPosition 함수를 이용해 현재 view item의 index를 찾을 수 있다. 이 정보와 outRect 인자를 활용해서 각 간격을 얼마나 줄 것인지 설정 할 수 있다.

     

    recyclerview.addItemDecoration(object: RecyclerView.ItemDecoration() {
        override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
            super.getItemOffsets(outRect, view, parent, state)
            when (parent.getChildAdapterPosition(view)) {
                0 -> {
                    outRect.left = DimensionUtils.dp2px(context, 20f).toInt()
                    outRect.right = DimensionUtils.dp2px(context, 10f).toInt()
                }
                listAdapter?.itemCount?: 1 - 1 -> {
                    outRect.left = DimensionUtils.dp2px(context, 10f).toInt()
                    outRect.right = DimensionUtils.dp2px(context, 20f).toInt()
                }
                else -> {
                    outRect.left = DimensionUtils.dp2px(context, 10f).toInt()
                    outRect.right = DimensionUtils.dp2px(context, 10f).toInt()
                }
            }
        }
    })

     

    이제 잘못짠 코드들을 하나씩 수정해야겠다..

    댓글

Designed by Tistory.