如何在onSizeChanged中设置大小和布局?

JOG*_*JOG 26 android listview resize refresh

例如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);

    }
}
Run Code Online (Sandbox Code Playgroud)

操作栏的隐藏/显示按预期工作,但ListView在隐藏操作栏的高度下方有一个间隙.一旦任何图形改变(例如在编辑框中书写),ListView填补空白.隐藏键盘时,反向出现类似的行为.

在此输入图像描述

[编辑]

更改其他布局时也会出现同样的问题.直接更改节目中的内容,但VisibilityonSizeChanged其他一些用户操作重新绘制这些视图之前,不会显示更改大小和边距.无效无效onSizeChanged.

[/编辑]

我试图通过以下方式刷新图形:

  • invalidate-ing无论是定制的LinearLayout和ListView (推荐这里)
  • notifyDataSetChanged 在列表的适配器上
  • forceLayout

......还有更多,没有成功.为什么一开始ListView不调整大小?我是否必须onLayout在扩展的LinearLayout中覆盖?我错过了什么?

asp*_*ame 37

在最后添加以下内容onSizeChanged()将解决它:

Handler handler = new Handler();
handler.post(new Runnable() {

    @Override
    public void run() {
        requestLayout();
    }
});
Run Code Online (Sandbox Code Playgroud)

请参阅此问题的答案:在更改大小后,自定义ViewGroup内的视图无法呈现

  • View有一个post()方法,因此您不需要分配Handler. (13认同)