【问题标题】:listview in another listview is not expanding when items are added to it将项目添加到另一个列表视图中的列表视图不会扩展
【发布时间】:2015-04-23 20:48:33
【问题描述】:

我有一个列表视图,其中包含许多不同的元素,例如 EditText、TextView 和 ListView。

我知道在另一个 Listview 中添加 Listview 听起来有点奇怪,但我有我的理由。 我需要做的是使内部 Listview “可扩展”。每当添加或删除项目时,它都应该扩展和收缩。 我尝试给 ListView 指定高度:wrap_content,但它没有做任何事情。当我将项目添加到列表中时,它们只是被隐藏了,因为它们没有空间。

如何使这个内部 ListView 在添加项目时自行扩展? (它必须是列表视图中的列表视图!所以请不要对其他类型的实现提出其他建议:)

这里是包含外部布局的项目布局的 xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:id="@+id/trainingpass_headline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="false"
        android:layout_alignParentTop="true"
        android:text="Trainingpass"
        android:textSize="16dp"
        android:textColor="@android:color/white"
        android:background="@android:color/holo_blue_dark"
        android:height="35dp"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:textIsSelectable="true"
        android:textStyle="bold"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <ImageView
        android:id="@+id/trainingpass_showhide_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_blue_dark"
        android:height="25dp"
        android:minWidth="50dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:padding="7dp"
        android:layout_alignBottom="@+id/trainingpass_headline"
        android:src="@mipmap/arrows_up_down"
        android:layout_alignParentTop="true" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/trainingpass_headline"
        android:layout_alignLeft="@+id/trainingpass_headline"
        android:layout_alignStart="@+id/trainingpass_headline"
        android:id="@+id/trainingPassContainer"
        android:background="@color/blue_bg_neutral"
        android:visibility="visible"
        android:paddingBottom="10dp">

        <EditText
            android:id="@+id/trainingpass_exercise_searchfield"
            android:layout_width="fill_parent"
            android:layout_height="40dp"
            android:hint="Name of exercise"
            android:padding="6dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:background="@color/blue_bg_inputField"
            android:layout_margin="10dp" />

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/trainingpass_exercise_searchfield"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:id="@+id/sets_container"
            android:background="@color/blue_bg_inputField"
            android:padding="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp">

            <TextView
                android:id="@+id/txt_sets_for_exercise"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Sets for exercise"
                android:textSize="14dp"
                android:textColor="@android:color/black"
                android:paddingRight="30dp"
                android:paddingLeft="0dp"
                android:paddingTop="0dp"
                android:paddingBottom="10dp"
                android:textStyle="bold"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignRight="@+id/add_set_button"
                android:layout_alignEnd="@+id/add_set_button" />

            <ListView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@+id/trainingpass_sets_listview"
                android:nestedScrollingEnabled="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_alignTop="@+id/txt_no_sets" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Add set"
                android:id="@+id/add_set_button"
                android:layout_below="@+id/trainingpass_sets_listview"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Add exercise"
                android:id="@+id/add_exercise_button"
                android:layout_below="@+id/add_set_button"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />

            <TextView
                android:id="@+id/txt_no_sets"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="No sets yet"
                android:textSize="14dp"
                android:textColor="@android:color/black"
                android:paddingRight="30dp"
                android:paddingLeft="10dp"
                android:paddingTop="20dp"
                android:paddingBottom="10dp"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_below="@+id/txt_sets_for_exercise"
                android:visibility="invisible" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_below="@+id/sets_container"
            android:id="@+id/exercises_container"
            android:background="@color/blue_bg_inputField"
            android:padding="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp">

            <TextView
                android:id="@+id/txt_exercises"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Exercises"
                android:textSize="14dp"
                android:textColor="@android:color/black"
                android:paddingRight="30dp"
                android:paddingLeft="0dp"
                android:paddingTop="0dp"
                android:paddingBottom="10dp"
                android:textStyle="bold"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignRight="@+id/txt_no_exercises_yet"
                android:layout_alignEnd="@+id/txt_no_exercises_yet" />

            <TextView
                android:id="@+id/txt_no_exercises_yet"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="No exercises yet"
                android:textSize="14dp"
                android:textColor="@android:color/black"
                android:paddingRight="30dp"
                android:paddingLeft="10dp"
                android:paddingTop="20dp"
                android:paddingBottom="10dp"
                android:layout_below="@+id/txt_exercises"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true" />

            <ListView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@+id/exercises_listview"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_below="@+id/txt_exercises"
                android:layout_alignBottom="@+id/txt_no_exercises_yet" />

        </RelativeLayout>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Delete"
            android:id="@+id/delete_trainingpass_button"
            android:layout_alignRight="@+id/exercises_container"
            android:layout_alignEnd="@+id/exercises_container"
            android:layout_below="@+id/exercises_container"
            android:background="@color/btn_red"
            android:layout_marginLeft="10dp" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Done"
            android:id="@+id/done_trainingpass_button"
            android:layout_below="@+id/exercises_container"
            android:layout_alignLeft="@+id/exercises_container"
            android:layout_alignStart="@+id/exercises_container"
            android:layout_toStartOf="@+id/delete_trainingpass_button"
            android:background="@color/btn_green"
            android:layout_marginRight="10dp" />

    </RelativeLayout>

</RelativeLayout>

我想要扩展的 ListView 是“trainingpass_sets_listview”,在上面的代码中。

这是“trainingpass_sets_listview”项的xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:orientation="vertical"
    android:textAlignment="center"
    android:transitionGroup="true">

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="X"
        android:id="@+id/btn_delete_set"
        android:background="@color/btn_red"
        android:height="40dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignBottom="@+id/btn_minus_set" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/field_sets"
        android:minWidth="50dp"
        android:background="@color/white"
        android:textAlignment="center"
        android:padding="10dp"
        android:editable="false"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/btn_plus_set"
        android:layout_toEndOf="@+id/btn_plus_set" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14dp"
        android:id="@+id/txt_setNo"
        android:layout_alignParentTop="true"
        android:layout_alignBottom="@+id/field_sets" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:text="+"
        android:id="@+id/btn_plus_set"
        android:layout_marginLeft="25dp"
        android:layout_marginStart="40dp"
        android:layout_alignBottom="@+id/field_sets"
        android:layout_toRightOf="@+id/txt_setNo"
        android:layout_toEndOf="@+id/txt_setNo"
        android:layout_alignParentTop="true"
        android:background="@color/blue_bg_inputField_darker" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:text="-"
        android:id="@+id/btn_minus_set"
        android:layout_toRightOf="@+id/field_sets"
        android:layout_toEndOf="@+id/field_sets"
        android:layout_alignParentTop="true"
        android:background="@color/blue_bg_inputField_darker"
        android:layout_alignBottom="@+id/field_sets" />
</RelativeLayout>

如果需要更多信息或代码,请尽管询问。

提前致谢:)

【问题讨论】:

  • 我知道您说“它需要是列表视图中的列表视图!所以请不要对其他类型的实现提出其他建议”,但是既然您想要列表视图中的列表视图,为什么不尝试可扩展的列表显示? developer.android.com/reference/android/widget/…
  • 不能简单地将 ListView 放在 ListView 中。你能解释一下这种愚蠢的原因吗?
  • 我同意……“拜托,没有其他 [实施] 建议”有点傻。有时,您想要的方式在 Android 中是不可能的。 :) 除非编写自定义视图。

标签: android android-layout android-listview


【解决方案1】:

必须是listview中的listview!

你做不到。 ListViews 并非旨在相互嵌入。这进一步扩展为:永远不要嵌入以相同方向滚动的可滚动小部件。这是 Android 中最大的禁忌之一。虽然你可以让类似的东西工作......它会有问题并且永远不会 100% 工作。

所以,请不要对其他类型的实现提出其他建议:)

那么你的问题只剩下一个没有答案了。但是,让我们假装它可以工作。请允许我另外说一下为什么你不应该采用你的方法。

性能: 每个ListView 都有一个适配器支持。每个适配器都有一个方法,getView(),用于生成在ListView 中显示到屏幕的每个项目。无法保证在渲染到屏幕时会为每个项目的位置调用多少次getView()。每个位置看到它被调用3-4次并不异常。如果每个位置都包含一个ListView(正如您正在尝试做的那样),而它又拥有自己的适配器,那么每个项目还需要多次渲染才能渲染。这一切都加快了将某些内容渲染到屏幕所需的传递次数,并且您的性能受到了很大的影响。

重新发明轮子: 正如@Fareya 所指出的,Android 已经为创建这样的UI 外观提供了一个解决方案,它被称为ExpandableListView。它可以轻松完成您想要做的事情。通过使用它而不是尝试推出自己的解决方案,您将节省时间和挫败感。

【讨论】:

  • "ListViews 的设计初衷不是相互嵌入。"请遵循这些智慧之言。
  • 好的,我明白你的意思了。我想将列表视图放在列表视图中的原因仅用于学习目的。但我现在明白,这绝不会是一个好方法。我将使用 ExpandableListView。谢谢
【解决方案2】:

您可以像这样创建自定义列表视图并覆盖其onMeasure 方法。

public class UnscrollableListView extends ListView {

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

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

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

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

}

这将使列表视图能够包装其内容并具有可伸缩性。

将此列表视图用作您的内部列表视图将满足您的需求。

看看我的回答here

但我不得不说,不建议让ListView 以这种方式工作。

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多