Как установить размер и макет в onSizeChanged?

Я не могу заставить свои элементы, например ListView , изменить размер должным образом.

У меня есть ListActivity для поиска с помощью панели управления, поля редактирования и просмотра списка. Идея состоит в том, чтобы скрыть панель действий, пока отображается клавиатура.

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

public class SizeChangingLinearLayout extends LinearLayout {
    //...
    @Override
    protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld)
    {        
        View actionbar = mainView.findViewById(R.id.actionbar);

        if (yNew > yOld) 
            actionbar.setVisibility(View.VISIBLE);
        else if (yNew < yOld) 
            actionbar.setVisibility(View.GONE);

        super.onSizeChanged(xNew, yNew, xOld, yOld);

    }
}

Скрытие / отображение панели действий работает, как ожидалось, но под ListView есть пробел той же высоты, что и скрытая панель действий. Как только изменяется какая-либо графика (например, запись в поле редактирования), ListView заполняет пробел. Аналогичное поведение проявляется в обратном порядке при скрытии клавиатуры.

enter image description here

[Edit]

Та же проблема возникает и при изменении другого макета. Изменение видимости вещей в onSizeChanged отображается напрямую, но изменение размеров и полей не отображается, пока какое-либо другое действие пользователя не перерисовывает эти представления. Недействительность не работает из onSizeChanged .

[/ Edit]

Я попытался обновить графику, выполнив:

  • invalidate - используя оба пользовательских LinearLayout и ListView (в виде рекомендуется здесь )
  • notifyDataSetChanged в списке адаптер
  • forceLayout

... и другие безуспешно. Почему ListView не меняет размер сначала? Должен ли я переопределить onLayout в моем расширенном LinearLayout? Что я пропустил?

26
задан Community 23 May 2017 в 12:25
поделиться