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))