具有多个LinearLayouts的ScrollView无法正确调整大小

时间:2015-09-03 14:06:36

标签: android android-layout

我已经创建了一个MaxLength控件,它来自GridView,这个控件的概念是它将包含以网格格式排列的多个ScrollView,并且具有给定的数字列和行。

首次构建视图时,Views不知道其容器的大小,所以我等到GridView方法被调用,然后我应用相关的大小。< / p>

当运行以下内容时,它不会重新调整网格大小以正确显示它,每个控件只能显示文本所需的大小。

当`onSizeChanged&#39;方法被调用,它具有正确的大小,并为每个子视图应用正确的大小,但它不会影响控件的绘制方式(即它们仍然全部聚集在左上角)屏幕)。

尽管如此,我实际上已经开始工作,但它吸引了两次。我是通过创建调用onSizeChanged的{​​{1}}来完成此操作的。然后在致电Runnable后直接致电ResizeList

虽然这是一个解决方案,但我不明白为什么它不能以下面的形式工作。

顺便提一下,如果new Handler().post(r)是添加到BuildIt的主GridView,则它显示正常,只有在随后添加时才会显示。这就是为什么我有View,你必须按下来显示网格。

有人可以建议为什么下面的代码无法正常工作吗?

Activity

Button

public class MainActivity extends Activity  {
    GridView sv;
    FrameLayout flay;
    @Override protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        flay=new FrameLayout(this);
        this.setContentView(flay);
        Button b=new Button(this);
        b.setText("press me to show grid view");
        b.setOnClickListener(ocl);
        flay.addView(b);
    }

    OnClickListener ocl=new OnClickListener() 
    {
        @Override public void onClick(View v)
        {
            BuildIt();
        }};

    private void BuildIt()
    {
        flay.removeAllViews(); // remove the button control
        sv=new GridView(this);

        for (int c1=0 ; c1<30 ; c1++)
        {
            TextView tv=new TextView(this);
            tv.setText("Item "+c1);
            tv.setGravity(android.view.Gravity.CENTER);
            sv.addListItem(tv);
        }
        flay.addView(sv);
        sv.ConstructList();
    }
}

2 个答案:

答案 0 :(得分:0)

我有一个函数,用于在gridView中调整孩子的宽度和高度。

可能这可以帮到你:

public static void setGridChild_Height(GridView gridView, int columns) {
        ListAdapter listAdapter = gridView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        int items = listAdapter.getCount();
        int rows = 0;

        for (int j = 0; j < items; j++) {
            View view = gridView.getChildAt(j);
            if (view != null && view.getHeight() > totalHeight) {
                totalHeight = view.getHeight();
            }
        }
        System.out.println("totalHeight -> " + totalHeight);
        if (totalHeight > 0) {
            for (int j = 0; j < items; j++) {
                View view = gridView.getChildAt(j);
                if (view != null && view.getHeight() < totalHeight) {
                    view.setMinimumHeight(totalHeight);
                }
            }
        }

        // View listItem = listAdapter.getView(0, null, gridView);
        // listItem.measure(0, 0);
        // totalHeight = listItem.getMeasuredHeight();
        //
        // float x = 1;
        // if (items > columns) {
        // x = items / columns;
        // rows = (int) (x + 1);
        // totalHeight *= rows;
        // }
        //
        // ViewGroup.LayoutParams params = gridView.getLayoutParams();
        // params.height = totalHeight;
        // gridView.setLayoutParams(params);
    }

尝试根据您的要求更改逻辑。 代码未经过完美测试

答案 1 :(得分:0)

这是因为onSizeChanged新添加到视图层次结构时使用了它的旧大小&#34; 0&#34; (根据文档:http://developer.android.com/reference/android/view/View.html#onSizeChanged(int, int, int, int)

我认为您想要的是addOnLayoutChangedListenerhttp://developer.android.com/reference/android/view/View.html#addOnLayoutChangeListener(android.view.View.OnLayoutChangeListener)

使用ViewTreeObserver可能是另一个适合您的选项:How can you tell when a layout has been drawn?