17

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

我使用了 wrap_content 但这无济于事如果我删除滚动视图然后它的工作

代码。“垂直滚动的 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>

如下所示的输出我想要与内容相同的内容没有滚动视图

在此处输入图像描述

4

10 回答 10

44

使用此代码

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);
    }
}
于 2014-06-12T14:11:03.340 回答
12

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

但是,如果您真的想这样做,您可以看一下:如何将 ListView 放入 ScrollView 而不会崩溃?

于 2013-09-25T07:24:41.847 回答
8

在您的父布局中,将高度设置为wrap_content. 这应该有效。

于 2013-09-25T06:43:13.540 回答
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);
}
于 2013-09-25T06:52:49.507 回答
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>
于 2017-01-29T05:21:39.663 回答
2

正如 Permita 所指出的,您不应该在 Scrollview 中有 ListView。您应该使用例如 LinearLayout 来代替。

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

旧视图:

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

新观点:

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

旧代码:(在对话框/片段/活动中)

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();
    }
}

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

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());
}

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

public void updateOnLinearView(ViewGroup parentView) {
    // Note reusing child views if there are any
    for (int pos = 0; pos < getCount(); pos++) {
        View existingView = parentView.getChildAt(pos);
        if (existingView != null) getView(pos, existingView, parentView);
        else parentView.addView(getView(pos, null, parentView));
    }
    while (parentView.getChildCount() > getCount())
        parentView.removeViewAt(getCount());
}
于 2018-02-23T20:56:55.153 回答
1

这里要注意几件事..

  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)
    }
于 2019-10-10T06:55:28.257 回答
0

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

于 2013-09-25T06:36:16.717 回答
0

问题是“ScrollView”中的“ListView”

ListView 已经有自动滚动了,可以删除

于 2020-12-14T18:55:06.747 回答
-2

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

于 2013-09-25T06:31:35.807 回答