Android에서 ItemDecoration을 사용해 보았습니다.

목적


  • ItemDecoration을 사용해 본다.
    소재:캘린더(Grid 형식)
    아래에서 작성한 캘린더를 개조해, 매월의 헤더를 ItemDecoration로 실현한다.




  • 포인트



    RecyclerView.ItemDecoration에서 할 수있는 일은 크게 두 가지.
    - getItemOffsets
     item의 위치를 ​​이동한다
    - onDraw, onDrawOver
    item 아래 또는 위로 그리기

    구현 내용


  • getItemOffsets 로, 「달의 1주째」의 표시 위치를 100 하향으로 이동합니다.
  • onDrawOver에서 1로 이동한 부분에 머리글 배경과 텍스트(월, 서기)를 그립니다.

  • DateItemDecoration.kt
    class DateItemDecoration: RecyclerView.ItemDecoration() {
        companion object {
            private const val HEADER_HEIGHT = 100
            private val headerBackGroundPaint = Paint().apply {
                color = Color.GRAY
                alpha = 200
            }
            private val headerTextPaint = Paint().apply {
                textSize = 65f
                color = Color.WHITE
            }
        }
    
        override fun getItemOffsets(
                outRect: Rect,
                view: View,
                parent: RecyclerView,
                state: RecyclerView.State
        ) {
            super.getItemOffsets(outRect, view, parent, state)
            if ((parent.getChildViewHolder(view) as DateAdapter.DateAdapterHolder).isFirstWeek) {
                outRect.top = HEADER_HEIGHT
            } else {
                outRect.top = 0
            }
        }
    
        override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
            super.onDrawOver(c, parent, state)
            val size = state.itemCount
            for (i in 0 until size step 7) {
                drawHeader(parent, c, i, i + 7)
            }
        }
    
        private fun drawHeader(parent: RecyclerView, c: Canvas, prev: Int, now: Int) {
            val prevView = parent.getChildAt(prev)
            val prevHolder =
                    if (prevView == null) {
                        return
                    } else {
                        parent.getChildViewHolder(prevView) as DateAdapter.DateAdapterHolder
                    }
            if (prevHolder.isFirstWeek) {
                c.drawRect(
                        0f,
                        prevView.y - HEADER_HEIGHT,
                        parent.width.toFloat(),
                        prevView.y,
                        headerBackGroundPaint
                )
                c.drawText(
                        "${prevHolder.month} ${prevHolder.year}",
                        0f,
                        prevView.y,
                        headerTextPaint
                )
            }
        }
    }
    

    코드에 대한 자세한 내용은 아래 참조:
    htps : // 기주 b. 코 m / 요시 히로 카토 / 안 d 로이 d 사 mp ぇ s / t re / b8 ~ b2489 ~ fb113 50df947400 아 640fc357 아 0801 / 코 t 사 mp ぇ 아 p ぃ 카치

    좋은 웹페이지 즐겨찾기