2013-10-07 3 views
4

У меня есть этот родительский макетListView внутри ListView и вопрос с высотой вложенной ListView

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

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 
     android:gravity="center|top" 
     android:text="Title" 
     android:textSize="20sp" /> 

    <ListView 
     android:id="@+id/parent_listview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 
</LinearLayout> 

и parent_listview в элементы списка имеют этот макет

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" android:background="@color/mediumBlue" > 

    <TextView 
     android:id="@+id/sub_title" 
     android:layout_width="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_height="wrap_content" /> 

    <ListView 
     android:id="@+id/child_listview" 
     android:layout_width="wrap_content" 
     android:layout_height="250dp" 
     android:layout_below="@id/sub_title" > 
    </ListView> 

</RelativeLayout> 

и элементы child_listview имеют этот макет

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" android:background="@color/green" > 

    <TextView 
     android:id="@+id/childName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="10dp" /> 

    <TextView 
     android:id="@+id/childDesc" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="10dp" > 
    </TextView> 

</RelativeLayout> 

Я ожидаю увидеть

Parent Layout 
    - Parent ListView 
      - Parent Item 1 
        -Child item 1 
        -Child item 2 
        -Child item 3 
      - Parent Item 2 
        -Child item 1 
        -Child item 2 
      - Parent Item 3 
        -Child item 1 
      - Parent Item 4 
        -Child item 1 
        -Child item 2 
        -Child item 3 

но ребенок ListView отображается только один элемент (первый элемент), что-то вроде этого

Parent Layout 
    - Parent ListView 
      - Parent Item 1 
        -Child item 1 
      - Parent Item 2 
        -Child item 1 
      - Parent Item 3 
        -Child item 1 
      - Parent Item 4 
        -Child item 1 

если я вручную регулировать высоту ребенка ListView сказать, 250dp, она показывает больше деталей, но я хочу высота списка childview для автоматической обертки в соответствии с количеством элементов. Как я могу это достичь? (У меня есть адаптеры для обоих списков, но я не уверен, что это актуально для этого обсуждения, и поэтому я не включаю его).

+0

вместо listview в listview, используйте расходуемое listview – njzk2

+0

@ njzk2 вместо внешнего списка или вложенного списка или обоих? –

+0

вместо обоих. цель расходуемого списка - отобразить список списков. – njzk2

ответ

2

Как правило, вы никогда не должны иметь ListView, встроенный в другой ListView. Android не любит встраивать прокручиваемый контент.

Если вы действительно не хотите делать то, что вы описываете. Вы можете использовать (вставлять) в ListView, который агрессивно предварительно вычисляющий это высота на основе содержимого адаптера, как так:

public class ExpandedListView extends ListView { 

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

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

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     setListViewHeightBasedOnChildren(this); 
    } 

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

     int totalHeight = 0; 
     int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      if (listItem != null) { 
      listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
      totalHeight += listItem.getMeasuredHeight(); 
      } 
     } 

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

и parent_listview в элементы списка имеют этот макет

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" android:background="@color/mediumBlue" > 

    <TextView 
     android:id="@+id/sub_title" 
     android:layout_width="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_height="wrap_content" /> 

    <com.example.ExpandedListView 
     android:id="@+id/child_listview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/sub_title" > 
    </com.example.ExpandedListView> 

</RelativeLayout> 
+0

отличные работы, спасибо! –

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