Я реализую простую гистограмму с представлением переработчика, где каждая полоса является элементом в представлении переработчика. Всякий раз, когда данные бара привязываются к держателю представления, размер бара пересчитывается. Кажется, это работает, но с двумя оговорками:
Полосы не отображаются вообще при запуске представления, только после прокрутки представления рециркулятора
при прокрутке нижние края полосок кажутся случайными, даже когда они полностью видны и слегка прокручивают вид вбок. Верхний край остается в правильном положении, только нижний край прыгает вокруг. Инспектор макетов показывает макет, расширяемый до нижней части вида; кажется, что отрезано только рисование. Также кажется, что это происходит только при прокрутке вида влево, в то время как при прокрутке вправо столбцы выглядят так, как должны.
Расположение одного столбца выглядит следующим образом:
<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
}
}
Что может вызвать это странное поведение