Добавляйте виды динамически и изменяйте размер родительской ViewGroup. - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь создать расширяемый / сворачиваемый CardView (корневой макет), в который я буду динамически добавлять представления к вертикальному LinearLayout (родительский макет), в частности TextInputLayouts.После добавления вида я хочу изменить размер макета, оживляя процесс, чтобы приспособить новый добавленный вид.Что я делаю:

  1. Вызов removeAllViews() родительского элемента
  2. Перебор некоторых объектов, инициализация дочерних представлений и добавление их с помощью addView()
  3. Рассчитайте новую высоту как:

    val previousMeasuredHeight = parentLayout.measuredHeight
    parentLayout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
    
  4. Анимируйте родительский макет к новой высоте как:

    val animator = ValueAnimator.ofInt(previousMeasuredHeight, measuredHeight)
    animator.addUpdateListener { valueAnimator ->
        layoutParams.height = valueAnimator.animatedValue as Int
        setLayoutParams(layoutParams)
    }
    animator.start()
    

ЯСтолкнувшись с двумя проблемами, связанными с этим:

  1. Когда должна быть показана метка ошибки TextInputLayout, она не видна, поскольку родительский элемент недостаточно велик для учета высоты, занимаемой меткой ошибки.Я предполагаю, что это как-то связано с использованием getMeasuredHeight() вместо правильного метода для вычисления общей требуемой высоты
  2. Когда я добавляю больше видов и расширяю родительский макет, только последний добавленный вид виден, так как он сидит наверхняя часть родительского макета

Я также пытался использовать RecyclerView, но есть и проблемы, например, при добавлении элемента он не отображается или родительский макет неправильно изменяет размер

Как мне решить эти проблемы?

1 Ответ

0 голосов
/ 09 июня 2018

Попробуйте взглянуть на animateLayoutChanges .

Это выглядит правильно для того, чего вы пытаетесь достичь, и должно устранить трудности с вычислением высоты и анимации самостоятельно.

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