Listview与内容相同的高度

时间:2013-09-25 06:27:56

标签: android android-layout android-listview

我使用自定义列表视图。内容来自动态我希望与内容相同的列表视图高度。

我使用了wrap_content但这没有帮助如果我删除了scrollview然后它的工作

代码。 “垂直滚动ScrollView不应包含另一个垂直滚动小部件(ListView)”

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_img"
    android:scrollbars="none" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

<ListView
            android:id="@+id/lstsemtrack"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        android:divider="#f2e4e4"
        android:dividerHeight="1dip"
             >
        </ListView>

物品清单

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dip"
    android:scrollbars="none" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="4" >

        <TextView
            android:id="@+id/txtBiology"
            style="@style/sem_rowtext"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginRight="5dip"
            android:layout_weight="1"
            android:text="Biology" />

        <TextView
            android:id="@+id/txtClass"
            style="@style/sem_rowtext"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Biology - 101" />

        <TextView
            android:id="@+id/txtGrade"
            style="@style/sem_rowtext"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Grade" />

        <TextView
            android:id="@+id/txtGrade"
            style="@style/sem_rowtext"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Remove" />
    </LinearLayout>

</LinearLayout>

输出如下所示我想要内容没有scrollview

enter image description here

10 个答案:

答案 0 :(得分:33)

使用此代码

public class MyListView  extends ListView {

    public MyListView  (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView  (Context context) {
        super(context);
    }

    public MyListView  (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

答案 1 :(得分:11)

您不应将ListView放在ScrollView中,因为ListView本身是一个显示可滚动项列表的视图组。如果在scrollview中使用它,它将不会接收滚动事件,因为它们都由父ScrollView处理。使用ListView使其不滚动是非常昂贵的,并违背ListView的整个目的。你不应该这样做。只需使用LinearLayout。

但是,如果你真的想这样做,你可以看一下:How can I put a ListView into a ScrollView without it collapsing?

答案 2 :(得分:7)

在您的父版面中,将高度设置为wrap_content。这应该有用。

答案 3 :(得分:4)

其他建议不起作用,因为在将它拉入屏幕之前无法确定ListView内容的高度(当然除非你有一个固定的高度,然后将其用作ListView的高度)

您可以做的是在绘制其中的元素后设置ListView的高度。您可以在活动的onWindowFocusChanged中执行此操作。举个例子:

public void onWindowFocusChanged(boolean hasFocus) {
    // get content height
    int contentHeight = listView.getChildAt(0).getHeight();

    // set listview height
    LayoutParams lp = listView.getLayoutParams();
    lp.height = contentHeight;
    listView.setLayoutParams(lp);
}

答案 4 :(得分:2)

使用自己的自定义ListView
创建一个类CustomListView.java并像这样扩展ListView ..

public class CustomListView extends ListView {

private android.view.ViewGroup.LayoutParams params;
private int prevCount = 0;

public CustomListView(Context context, AttributeSet attrs)
{
    super(context, attrs);
}

@Override
protected void onDraw(Canvas canvas)
{
    if (getCount() != prevCount) 
    {
        int height = getChildAt(0).getHeight() + 1 ;
        prevCount = getCount();
        params = getLayoutParams();
        params.height = getCount() * height;
        setLayoutParams(params);
    }

    super.onDraw(canvas);
}

}

然后在xml中使用它

 <yourPackageName.CustomListView
        android:id="@+id/lstsemtrack"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:divider="#f2e4e4"
        android:dividerHeight="1dip">
 </yourPackageName.ListView>

答案 5 :(得分:1)

如Permita所述,您不应在Scrollview中拥有ListView。您应该使用例如LinearLayout。

在某些情况下,您已经制作了要重复使用的自定义适配器。在这种情况下,这些代码片段可能很有用。

旧观点:

var slider = document.getElementById('sliderInput');
var main = document.getElementById('mainContainer');

setViewPort(slider.value);

slider.oninput = function(){
    setViewPort(this.value);
}

slider.onclick = function(){
    alert('clicked!');
}

//For sliding
function setViewPort(pourcentage){
var width = main.offsetWidth*(pourcentage/100);
  document.getElementById('containerImgSliding').style.width = width+'px';
}

新观点:

...
<ListView android:id="@+id/myListView" ... />
...

旧代码:(在dialog / fragment / activity中)

...
<LinearLayout
    android:orientation="vertical"
    android:id="@+id/myLinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
...

新代码:(自己做一些“listview” - 如果可能的话重用视图)

YourAdapter listAdapter;
...
ListView listView = (ListView)rootView.findViewById(R.id.myListView);
...
if (listView != null) {
    if (listAdapter == null) {
        listAdapter = new YourAdapter(...);
        listView.setAdapter(listAdapter);
    } else {
        listAdapter.notifyDataSetChanged();
    }
}

更新: 或者只是将其添加到您的适配器并在列表视图上调用它而不是setAdapter,并在适配器上调用notifyDataUpdated:

YourAdapter listAdapter;
...
LinearLayout linearLayout = (LinearLayout) rootView.findViewById(R.id.myLinearLayout);
...
if (linearLayout != null) {
    if (listAdapter == null) listAdapter = new YourAdapter(...);
    for (int pos = 0; pos < listAdapter.getCount(); pos++) {
        View existingView = linearLayout.getChildAt(pos);
        if (existingView != null) listAdapter.getView(pos, existingView, linearLayout);
        else linearLayout.addView(listAdapter.getView(pos, null, linearLayout));
    }
    while (linearLayout.getChildCount() > listAdapter.getCount()) linearLayout.removeViewAt(listAdapter.getCount());
}

答案 6 :(得分:0)

尝试使用LinearLayout包装列表视图,并将LinearLayout的高度设置为wrap_content。

答案 7 :(得分:0)

这里要注意的几件事。

  1. 请勿在ScrollView内使用ListView
  2. 您将需要动态计算listView项以获取其高度。

这是一个执行此操作的功能。

public void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }

    int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        if (listItem instanceof ViewGroup)
            listItem.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);

}

您需要在

中调用相同的名称
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
setListViewHeightBasedOnChildren(listview)
    }

答案 8 :(得分:0)

问题是“ ScrollView”中的“ ListView”

ListView已经具有自动滚动功能,因此您可以将其删除

答案 9 :(得分:-2)

使用android:layout_height =“match_parent”,我认为它会起作用。