2015-04-23 1 views
1

У меня есть список, содержащий множество различных элементов, таких как EditText, TextView и ListView.listview в другом списке не расширяется, когда к нему добавляются элементы

Я знаю, что звучит немного странно, чтобы добавить Listview в другой список, но у меня есть причины. Что мне нужно сделать, делает внутренний Listview «масштабируемым». Он должен расширяться и сжиматься, когда элементы добавляются или удаляются из него. Я попытался предоставить ListView height: wrap_content, но ничего не сделал. Когда я добавляю элементы в список, они просто скрыты, поскольку для них нет места.

Как я могу сделать этот внутренний список ListView самораспространяющимся, когда элементы добавляются к нему? (Это должно быть ListView в 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» в приведенном выше коде.

Вот макет XML для пунктов «trainingpass_sets_listview»:

<?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

Я знаю, что вы заявили: «Это должно быть списком в списке! Так что, пожалуйста, никаких других предложений о других видах реализаций», но так как вы хотите, чтобы listview в списке учитывал, почему бы не попробовать расширяемое представление списка? http://developer.android.com/reference/android/widget/ExpandableListView.html – Fareya

+0

Не просто поместить ListView в ListView. Не могли бы вы объяснить причины этой глупости? – Lamorak

+0

Я согласен ... «пожалуйста, никакие другие [варианты реализации] немного глупы. Иногда то, как вы хотите это сделать, невозможно в Android. :) Если не написать пользовательский вид. – beyondtheteal

ответ

2

Это должно быть списком в списке!

Вы не можете этого сделать. ListViews не были предназначены для встраивания друг в друга. Это дополнительно расширяется до: Никогда не вставляйте прокручиваемые виджеты, которые прокручиваются в одном направлении. Это один из больших нет-нет в Android. В то время как вы можете немного разобраться в том, что это работает ... у него будут проблемы и никогда не будет работать на 100%.

Так что, пожалуйста, никаких других предложений о других видах реализации :)

Тогда вы не остается только нет ответа на ваш вопрос. Однако пусть делает вид, что он может работать. Позвольте мне сказать дополнительно, почему вы не должны идти с вашим подходом.

Эксплуатационные характеристики: Каждый ListView снабжен адаптером. Каждый адаптер имеет способ getView(), который используется для генерации каждого элемента, отображаемого на экране в ListView. Нет никакой гарантии, сколько раз getView() будет вызываться для позиции каждого элемента при визуализации на экран. Это ненормально видеть, что он называется 3-4 раза в каждой позиции. Если каждая позиция содержит ListView (как вы пытаетесь сделать), которая, в свою очередь, имеет собственный адаптер, то она дополнительно будет принимать несколько проходов на каждый элемент для рендеринга. Это все быстро объединяет количество проходов, сделанных для того, чтобы отобразить что-то на экране, и вы делаете большой удар по производительности.

Переизобретая Колесо: Как указал @Fareya, Android уже представила решение для создания такого внешнего вида пользовательского интерфейса, и это называется ExpandableListView. Он может легко делать то, что вы пытаетесь сделать. Вы сэкономите время и разочарования, используя его вместо того, чтобы пытаться опрокинуть свое собственное решение.

+0

«ListViews не предназначены для встраивания друг в друга». Пожалуйста, следуйте этим словам мудрости. – Emmanuel

+0

Хорошо, я вижу вашу мысль. Причина, по которой я хотел поставить listview в listview, была предназначена только для обучения. Но теперь я вижу, что это никогда не будет хорошим подходом. Я поеду с ExpandableListView. спасибо – Langkiller

0

Вы можете сделать пользовательский элемент управления ListView и переопределить его 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 работающих таким образом не предлагается.

 Смежные вопросы

  • Нет связанных вопросов^_^