Recycler вид украшения элемента и вид возвышения - PullRequest
1 голос
/ 10 июня 2019

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

Мои элементы - в основном MaterialCardView - имеют важное значение высоты: 16dp (благодаря нашим ребятам из пользовательского интерфейса ...)

Повышенияразрешено рисовать вне контейнера вида элемента с помощью

android:clipChildren="false"
android:clipToPadding="false"

Моя проблема заключается в том, что высота усекается при оформлении вида переработчика.

здесь код оформления:

class TopSpacingItemDecoration(context: Context) : RecyclerView.ItemDecoration() {

    private val spacing = context.resources.getDimension(R.dimen.margin_before_section)

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        val position = parent.getChildAdapterPosition(view)
        val type = adapter.getItemViewType(position)

        if (type == adapter.SPECIFIC_TYPE || other conditions) {
            outRect.set(0, spacing.toInt(), 0, 0)
        }
    }
}

Это выглядит так:

exemple

К вашему сведению: я не хочу управлять наценками на элемент, поскольку порядок представления переработчика является динамическим

Есть идеи, как это исправить????

1 Ответ

0 голосов
/ 10 июня 2019

Вы используете ItemDecorations для того, чтобы делать что-то, для чего они не предназначены, но вы не хотите использовать правильную вещь, и теперь вы хотите взломать решение?(Я правильно понял?)

В вашем стремлении разгадать эту загадку я дам вам 0.02c:

  1. ItemDecorations не предназначены для того, чтобы делать то, что вам нужночтобы сделать, следовательно, почему вы видите эти побочные эффекты.
  2. ItemDecorations - это способ RecyclerView дать вам возможность «украсить» представление, имея холст и несколько миллисекунд для рисования чего-либо на экране,полностью отсоединен от двигателя View / Layout / Measure.
  3. Вы специально запретили использование полей элемента (и отступов?) Из-за "динамического порядка".Я не совсем уверен, какой порядок имеет отношение к этому, но я не могу сражаться с вами на этом фронте;какой заказ?заказ товара?какое отношение заказ имеет к полям или интервалу?(Я уверен, что есть причины, вы не перечислили их).Как порядок повлияет на это?Различны ли поля / интервалы с разных сторон, потому что элементы разные?Я предполагаю это, потому что вы предоставляете небольшую подсказку в этом if (item == type_xxx) {}, поэтому я предполагаю, что вы используете какой-то itemType для рендеринга различных представлений в вашем представлении переработчика, и теперь вы хотите добавить некоторые динамические поля к этим элементам на основеих соседи.

Я предполагаю все это.

Ответ: вы не можете рисовать за пределами представления из ItemDecorator, потому что, как бы он ни был крут, холст, переданный на него (так что он может рисовать), уже рассчитан и ограничен мерой / макетом Androidдвигатель.

Также:

android:clipChildren="false"
android:clipToPadding="false"

имеет побочные эффекты (производительность невелика).

Помимо производительности, вы просто не можете (или, скорее, не должны!) Пытаться сделать это таким образом.Декорации не должны быть открытыми для розыгрыша в любом месте.Я предлагаю вам предоставить надлежащие отступы / поля, где это относится, в представлениях элементов и / или в представлении реселлера.Они могут работать с пикселями плотности, а также учитывать варианты сборки и варианты, когда они предоставляются через ресурсы (например, измерениеs.xml).

Ни одна из этих технологий не будет доступна для декоратора элементов,Но если вы также проигнорируете разделение кода, принцип единой ответственности, инверсию контроля и все эти жаргоны, вы все равно не сможете это сделать, потому что ваш холст для вас предварительно рассчитан, и ваши мечты нарисовать где-нибудь наscreen.

(хорошо, вы можете рисовать где угодно, но это не НАЖИМАЕТ другие виды, вы просто рисуете поверх содержимого, не касаясь его).

...