我有一个包含很多不同元素的列表视图,例如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>
如果需要更多信息或代码,请询问。
提前致谢:)
答案 0 :(得分:2)
它必须是列表视图中的列表视图!
你不能这样做。 ListViews
并非旨在相互嵌入。这进一步扩展为:从不嵌入向同一方向滚动的可滚动小部件。这是Android中最大的禁忌之一。虽然你可以在某种程度上得到类似的工作......它会有问题,永远不会100%工作。
所以请,关于其他类型的实现没有其他建议:)
然后你只剩下你的问题的答案。然而,让我们假装它可以工作。请允许我另外说明为什么你不应该采用你的方法。
<强>性能:强>
每个ListView
都由适配器支持。每个适配器都有一个方法getView()
,用于生成ListView
中显示在屏幕上的每个项目。无法保证在渲染到屏幕时为每个项目的位置调用getView()
次。看到它每个位置调用3-4次并不是异常的。如果每个位置包含ListView
(正如您尝试的那样),而后者又拥有自己的适配器,那么每个项目还需要多次传递才能呈现。这一切都快速地增加了为屏幕呈现内容而传递的次数,并且你正在对性能产生重大影响。
重新发明轮子
正如@Fareya所指出的,Android已经提供了一种创建这种UI外观的解决方案,它被称为ExpandableListView
。它可以很容易地做你想做的事情。通过利用它而不是尝试推出自己的解决方案,您将节省时间和挫折。
答案 1 :(得分:0)
您可以创建自定义列表视图并覆盖其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);
}
}
这将使listview包装其内容并可扩展。
使用此列表视图作为您的内部列表视图将满足您的需求。
查看我的回答here。
我还是要说不建议以这种方式工作ListView
。