Как накачать пользовательский XML-макет в CustomDecoration? - PullRequest
1 голос
/ 16 апреля 2019

Я хочу добавить пользовательский элемент ItemDecoration в мой RecyclerView, который представляет собой макет, определенный в файле XML.

До сих пор мне удавалось раздувать XML и положение с помощью canvas.translate (пока, не понимая всего).

В настоящее время у меня есть этот код для рисования:

override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {

        for (i in 0 until parent.childCount) {
            val child = parent.getChildAt(i)

            val left = child.marginLeft
            val top = child.top

            context?.let {

                //Inflate the Layout and set the Values (a text in this case)
                val view = LayoutInflater.from(it).inflate(R.layout.my_decoration_layout, parent, false)
                val textView = view.findViewById<TextView>(R.id.textView)
                textView.text = "This is an ItemDecoration"

                //Calculate the Size. Im using "hardcoded" values, but this does not seems to change how the View is rendered
                view.measure(1000,1000)
                view.layout(0, 0, 1000, 1000)

                //Draw. I had to translate the canvas to apply the offset for each "ViewHolder"
                canvas.save()
                canvas.translate(left.toFloat(), top.toFloat())
                view.draw(canvas)
                canvas.restore()
            }


        }
    }

XML-код (обратите внимание на цвета фона, чтобы увидеть визуализированную область):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_blue_light">

    <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_red_light"/>

</LinearLayout>

С этим я мог раздувать и размещать свой XML между каждым ViewHolder, но у меня все еще есть две большие проблемы:

  1. Мой TextView отрисовывается поверх ViewHolder, поэтому я получаю здесь перекрытие. Было бы здорово, если бы эта операция «рисования» подтолкнула ViewHolder.

  2. Даже мой пользовательский макет XML имеет ширину как «match_parent», он только переносит текстовое представление.

Если возможно, я бы хотел знать, что именно означает "мера" и "макет" и как это влияет на мою "область" просмотра. И как предотвратить перекрытие.

Я "решил" проблему перекрытия при рисовании текста на холсте, используя

Paint().apply {
    color = Color.BLACK
    style = Paint.Style.FILL
    textSize = 40f

    canvas.drawText(year.toString(), left.toFloat(), top.toFloat(), this)
}

Но так как мой макет немного сложнее, было бы неплохо понять, как это сделать с макетами XML.

Спасибо

...