2016-01-31 7 views
2

Я пытаюсь добавить listView внутри scrollView и.Как установить высоту ListView в зависимости от элементов внутри ScrollView

проблема в том, что я не могу установить ListView высоту программно и правильно перерисовать ScrollView, так как предметы под ним все еще находятся в старой позиции перед изменением высоты.

XML

<ScrollView 
      android:id="@+id/movie_detail_scroll_view" 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

      <RelativeLayout 
       android:id="@+id/movie_detail" 
       style="?android:attr/textAppearanceLarge" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:clipChildren="false"> 
         ........... 
       <ListView 
        android:id="@+id/trails_list_view" 
        android:layout_width="match_parent" 
        android:layout_height="200dp" 
        android:layout_alignParentLeft="true" 
        android:layout_alignParentStart="true" 
        android:layout_below="@+id/movie_videos_container" 
        android:choiceMode="none"/> 
       <include 
        android:id="@+id/movie_reviews_container" 
        layout="@layout/partial_movie_reviews" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_below="@+id/trails_list_view"/> 
         ............ 
     </RelativeLayout> 
    </ScrollView> 

метод, который я использовал, чтобы изменить размер ListView:

/** 
* Sets ListView height dynamically based on the height of the items. 
* 
* @param listView to be resized 
* @return true if the listView is successfully resized, false otherwise 
*/ 
public static boolean setListViewHeightBasedOnItems(ListView listView, ViewGroup container) { 

    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter != null) { 

     int numberOfItems = listAdapter.getCount(); 

     // Get total height of all items. 
     int totalItemsHeight = 0; 
     for (int itemPos = 0; itemPos < numberOfItems; itemPos++) { 
      View item = listAdapter.getView(itemPos, null, listView); 
      item.measure(0, 0); 
      totalItemsHeight += item.getMeasuredHeight(); 
     } 

     // Get total height of all item dividers. 
     int totalDividersHeight = listView.getDividerHeight() * (numberOfItems - 1); 

     // Set list height. 
     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalItemsHeight + totalDividersHeight; 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 

     //redraw the container layout. 
     container.requestLayout(); 

     return true; 

    } else { 
     return false; 
    } 

} 

результат: enter image description here

Я не могу избавиться от этого свободного пространства, даже если когда я перерисовываю ScrollView

Что мне делать?

+1

Вы уверены, что ListView - это самый простой способ сделать это? LinearLayout может быть более быстрым решением, если список очень короткий. –

+0

Я попробую LinearLayout – humazed

+0

Вы пробовали модифицировать layout_height в ListView? – Pooya

ответ

0

Сделайте свой Scrollview как выглядит следующим образом:

<ScrollView 
android:id="@+id/movie_detail_scroll_view" 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:fillViewport="true"> 
+0

та же проблема еще существует – humazed

0

попробовать ListView

android:layout_height="wrap_content" 

также Dont удалить:

android:fillViewport="true" 

из Scrollview

+0

та же проблема еще существует – humazed

+0

, если я использовал андроид: layout_height = «wrap_content» он будет показывать только один элемент – humazed

+0

даже если я извлекал андроид: fillViewport = «истинный» и добавьте ваши изменения в комментариях и только отредактируйте ответ, когда он работает, чтобы облегчить мне просмотр вашего сообщения. – humazed

0

изменение линейных

 <LinearLayout 
      android:id="@+id/movie_detail" 
      style="?android:attr/textAppearanceLarge" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:clipChildren="false"> 
        ........... 
      <ListView 
       android:id="@+id/trails_list_view" 
       android:layout_width="match_parent" 
       android:layout_height="200dp" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" 
       android:layout_below="@+id/movie_videos_container" 
       android:choiceMode="none"/> 
      <include 
       android:id="@+id/movie_reviews_container" 
       layout="@layout/partial_movie_reviews" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       /> 
        ............ 
    </LinearLayout> 
</ScrollView> 
+0

Я сделал это, но не работал – humazed

0

Это работает 100% для чата, даже если высота элементов расходятся.

public static boolean setListViewHeightBasedOnItems(ListView listView) { 

    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter != null) { 

     int numberOfItems = listAdapter.getCount(); 

     // Get total height of all items. 
     int totalItemsHeight = 0; 
     for (int itemPos = 0; itemPos < numberOfItems; itemPos++) { 
      View item = listAdapter.getView(itemPos, null, listView); 
      float px = 500 * (listView.getResources().getDisplayMetrics().density); 
      item.measure(View.MeasureSpec.makeMeasureSpec((int) px, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
      totalItemsHeight += item.getMeasuredHeight(); 
     } 

     // Get total height of all item dividers. 
     int totalDividersHeight = listView.getDividerHeight() * 
       (numberOfItems - 1); 
     // Get padding 
     int totalPadding = listView.getPaddingTop() + listView.getPaddingBottom(); 

     // Set list height. 
     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalItemsHeight + totalDividersHeight + totalPadding; 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 
     //setDynamicHeight(listView); 
     return true; 

    } else { 
     return false; 
    } 

} 
+0

Это не работает с пользовательским адаптером – user2847219

+0

Я использую это с пользовательским адаптером. Измените этот параметр (число 500) = 500 * (listView.getResources(). GetDisplayMetrics(). Плотность); для вас. –

+0

но что такое 500? – user2847219

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