이 영역을 누르면 첫 페이지로 이동
CodeJUN 블로그의 첫 페이지로 이동

CodeJUN

페이지 맨 위로 올라가기

CodeJUN

심심해서 하는 블로그

RecyclerView에 줄 라인 추가하기(Divider)

  • 2020.07.27 17:50
  • Android

ListView와는 다르게 RecyclerView에는 기본적으로 line divider 가 존재하지 않는다. 따라서 RecyclerView에서 제공하는 addItemDecoration 함수를 사용해야 한다.

사실 이전에도 관련 글을 포스팅한 적이 있었는데 최근 들어 사용 언어를 Kotlin으로 갈아타게 되면서 코틀린 버전도 포스팅을 해볼까 한다..

 

적용을 위해서는 DividerItemDecoration 클래스를 만들고 line으로 사용할 xml을 생성해주면 된다.

일단 line으로 쓰이게 될 line_divider.xml 을 drawable안에 만들어준다.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <size android:width="1dp" android:height="1dp" />
    <solid android:color="#f0f0f0" />
</shape>

이렇게 되면 약간의 회색 줄이 생성된다. 이제 이를 사용할 class를 생성해보자. 클래스명은 원하는 대로..

class DividerItemDecoration(
    context: Context,
    resId: Int,
    val paddingLeft: Int,
    val paddingRight: Int
) : RecyclerView.ItemDecoration() {

    private var mDivider: Drawable? = null

    init {
        mDivider = ContextCompat.getDrawable(context, resId)
    }

    override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {

        val left = parent.paddingLeft + paddingLeft
        val right = parent.width - parent.paddingRight - paddingRight
        val childCount = parent.childCount

        for (i in 0 until childCount) {
            val child = parent.getChildAt(i)
            val params = child.layoutParams as RecyclerView.LayoutParams
            val top = child.bottom + params.bottomMargin
            val bottom = top + (mDivider?.intrinsicHeight ?: 0)

            mDivider?.let {
                it.setBounds(left, top, right, bottom)
                it.draw(c)
            }

        }
    }
}

설명을 조금 하자면.. 파라미터로 context와 styel을 적용할 drawable xml, 좌우 패딩 값을 받는다. 또한 ItemDecoration을 상속받은 것을 볼 수 있다. mDivider객체에 이전에 미리 만들어둔 라인으로 쓰게 될 xml을 지정해 주면 된다.

 

그렇게 되면 onDrawOver함수에서 라인을 그리게 되는 것이다.

 

실제 RecyclerView에서의 적용 방법은 아래와 같다.

recyclerView.addItemDecoration(DividerItemDecoration(context, R.drawable.line_divider, 80, 80))

나는 좌우 80 만큼의 간격을 주고 라인을 그릴 것이기 때문에 위와 같이 작성하였으나 이 또한 본인의 입맛대로, 디자인 가이드 대로 진행하면 된다.

 

좀 귀찮아지긴 했으나.. 코드가 좀 더 유연해진 느낌이다.

저작자표시 비영리 동일조건 (새창열림)

'Android' 카테고리의 다른 글

Android Studio 이전 버전 세팅 불러오는 방법  (0) 2020.08.13
Cannot invoke setValue on a background thread 해결 방법  (0) 2020.08.03
Layout Inspector로 레이아웃 디버깅하기  (0) 2020.06.01
Android에서의 MVVM은 무엇이고 왜 사용하는가  (0) 2020.04.06
Android 아키텍처 컴포넌트를 사용한 구조 개선  (0) 2020.04.03

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • Android Studio 이전 버전 세팅 불러오는 방법

    Android Studio 이전 버전 세팅 불러오는 방법

    2020.08.13
  • Cannot invoke setValue on a background thread 해결 방법

    Cannot invoke setValue on a background thread 해결 방법

    2020.08.03
  • Layout Inspector로 레이아웃 디버깅하기

    Layout Inspector로 레이아웃 디버깅하기

    2020.06.01
  • Android에서의 MVVM은 무엇이고 왜 사용하는가

    Android에서의 MVVM은 무엇이고 왜 사용하는가

    2020.04.06
다른 글 더 둘러보기

정보

CodeJUN 블로그의 첫 페이지로 이동

CodeJUN

  • CodeJUN의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 방명록

카테고리

  • 분류 전체보기 (54)
    • Android (38)
    • BlockChain (4)
    • React Native (4)
    • 아두이노 (2)
    • 프로젝트 (6)

공지사항

  • 공지 - 블로그를 시작하며

태그

  • Android
  • 아두이노
  • C
  • Firebase
  • c++
  • 강좌
  • arduino
  • 안드로이드

나의 외부 링크

  • Github

정보

CODE_JUN의 CodeJUN

CodeJUN

CODE_JUN

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © CODE_JUN. Designed by Fraccino.

티스토리툴바