Динамически изменяемое представление внутри видоискателя ведет себя странно при прокрутке - PullRequest
0 голосов
/ 16 января 2020

Я реализую простую гистограмму с представлением переработчика, где каждая полоса является элементом в представлении переработчика. Всякий раз, когда данные бара привязываются к держателю представления, размер бара пересчитывается. Кажется, это работает, но с двумя оговорками:

  • Полосы не отображаются вообще при запуске представления, только после прокрутки представления рециркулятора

  • при прокрутке нижние края полосок кажутся случайными, даже когда они полностью видны и слегка прокручивают вид вбок. Верхний край остается в правильном положении, только нижний край прыгает вокруг. Инспектор макетов показывает макет, расширяемый до нижней части вида; кажется, что отрезано только рисование. Также кажется, что это происходит только при прокрутке вида влево, в то время как при прокрутке вправо столбцы выглядят так, как должны.

Расположение одного столбца выглядит следующим образом:

<LinearLayout
    android:layout_width="@dimen/bar_width"
    android:layout_height="match_parent">

    <View
        android:id="@+id/primaryBar"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <View
        android:id="@+id/secondaryBar"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Макет гистограммы:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Graph background here, not relevant -->

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/bar_recycler"
        layout_width="match_parent"
        layout_height="match_parent" />

    <!-- Graph overlay here, not relevant -->
</FrameLayout>

Логика привязки c данных гистограммы примерно такая:

class BarView(context: Context) : FrameLayout(context) {

    val primaryBar: View

    init {
        View.inflate(context, R.layout.graph_bar, this)
        primaryBar = findViewById(R.id.primaryBar)
    }

    fun bind(data: BarData, maxValue: Double) {
        val maxBarHeight = measuredValue
        val primaryBarLayoutParams = primaryBar.layoutParams as LinearLayout.LayoutParams
        primaryBarLayoutParams.height = maxBarHeight * data.percentage
        primaryBar.background = data.drawable
    }
}

Что может вызвать это странное поведение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...