LoginSignup
2
1

More than 5 years have passed since last update.

RecyclerViewでSeparatorを表示する方法

Posted at

iOSでいうところのTableViewに相当するRecyclerViewだがUI周りは思ったより痒いところに手が届かない。

iOSでいうところのTableViewに相当するものを作るにはちょっと面倒でSeparator一つとっても実装がいる。以下のコードは拝借したコードに一部変更点を加えたものだ。

ItemDecolatorというClassを拡張してCellの描画に追記する形になる。
この辺はデフォルトで欲しいと思った。


class DividerItemDecoration: RecyclerView.ItemDecoration{
    private val ATTRS = intArrayOf(android.R.attr.listDivider)

    private var mDivider: Drawable

    constructor(context: Context){
        val a = context.obtainStyledAttributes(ATTRS)
        mDivider = a.getDrawable(0)
        a.recycle()
    }

    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        drawVertical(c, parent)
    }

    fun drawVertical(c: Canvas, parent: RecyclerView) {
        val left = parent.paddingLeft
        val right = parent.width - parent.paddingRight

        val childCount = parent.childCount
        // ここで-2にしているのは、最後のCellはSeparatorを出さないため
        for (i in 0..childCount - 2) {
            val child = parent.getChildAt(i)
            val params = child.layoutParams as RecyclerView.LayoutParams
            val top = child.bottom + params.bottomMargin
            val bottom = top + mDivider.getIntrinsicHeight()
            mDivider.setBounds(left, top, right, bottom)
            mDivider.draw(c)
        }
    }

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        outRect.set(0, 0, 0, mDivider.getIntrinsicHeight())
    }
}

// setする
recyclerView.addItemDecoration(DividerItemDecoration(context))


2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1