如何更改父视图的高度以适合子视图

时间:2013-10-20 07:44:41

标签: android android-layout android-custom-view

我有一个包含一个列表视图的相对视图。我在运行时创建这个相对视图,并将内容(基本上是一个字符串数组)添加到我的列表视图中。我已将listview的宽度和高度设置为“wrap_content”。 问题是我的列表父亲相对视图没有调整大小以显示我的列表视图。它只显示列表的第一个值。 我明白我必须覆盖onmeasure方法。那么,我怎样才能在onmeasure方法中获得listview的高度,这样我就可以将它传递给我的父视图 我已经阅读了很多像这样的问题但却无法正常工作。

另外一件事getMeasuredHeight()在我的onmeasure()方法中返回0。

更新

我的主要布局activity_main

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_route_search"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<RelativeLayout
    android:id="@+id/layout_main"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</RelativeLayout>

</ScrollView>

lo_block.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Text_view" />

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</RelativeLayout>

这是我的代码
Frag.java

public class Frag extends Fragment {

private View mView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    mView = inflater.inflate(R.layout.activity_main, null);

    showView();
    return mView;
}

public void showView() {

    block card = new block(getActivity());

    LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.WRAP_CONTENT);

    card.setLayoutParams(params);
    ViewGroup vg = (ViewGroup) mView.findViewById(R.id.layout_main);
    vg.addView(card);
}

private class block extends RelativeLayout {

// int listViewh = 0; // private float listViewHeight;

    public block(Context context) {
        super(context);

        View mView = View.inflate(getContext(), R.layout.lo_block, this);

        ListView lst = (ListView) mView.findViewById(R.id.listView1);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                getActivity(), android.R.layout.simple_list_item_1,
                new String[] { "ad", "sfsd", "sfsf", "asfsfs" });

        lst.setAdapter(adapter);
    }

    public block(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);

    }

    @Override
    public int getMinimumHeight() {

        return super.getMinimumHeight();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int w = MeasureSpec.getSize(widthMeasureSpec);
        int h = MeasureSpec.getSize(heightMeasureSpec);

// setMeasuredDimension(w,h);         }

}

}

main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

</LinearLayout>

我的主要活动     公共类MainActivity扩展了Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    getFragmentManager().beginTransaction().replace(R.id.fragment,
            new Frag()).commit();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}


}

1 个答案:

答案 0 :(得分:2)

在我的案例中,确切的问题是我试图将 listview置于scrollview内。,并且通常是 NOT RECOMMENDED 。但我设法扩展了我的列表视图。虽然它不能滚动它以前更好。下面是我在构造函数中添加的代码

ListView lst = (ListView) mView.findViewById(R.id.listView1);
        String[] arrayList = new String[] { "ad", "sfsd", "sfsf", "asfsfs",
                "ssfsff", "llkllk", "4323" };

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                getActivity(), android.R.layout.simple_list_item_1,
                arrayList);
        int totalHeight = 0;
        for (int i = 0; i < adapter.getCount(); i++) {
            View listItem = adapter.getView(i, null, lst);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }
        LayoutParams lp = (LayoutParams) lst.getLayoutParams();
        int height = totalHeight;

        // arraylist list is in which all data is kept

        lp.height = height;
        lst.setLayoutParams(lp);

        lst.setAdapter(adapter);