2015-10-23 2 views
1

Я пытаюсь реализовать вложенный ListView в нижней части моего интерфейса, но только один элемент моего массива заполняет экран. Я выяснил, что я могу отображать все мои объекты, если я устанавливаю атрибут Height (т. Е. «175dp» вместо «Wrap_Content»). Проблема в том, что размер списка не является статичным, поэтому мне нужно настроить высоту моего ListView во время выполнения.Изменить ListView Height at Runtime

Я выкопал сеть и здесь, на StackOverflow, но я не могу найти решение.

Спасибо!

код из моего фрагмента:

for (int i = 0; i < values.length; ++i) { 
    list.add(values[i]); 
} 

final StableArrayAdapter adapter = new StableArrayAdapter(rootView.getContext(), 
     android.R.layout.simple_list_item_1, list); 
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) rootView.findViewById(R.id.list_linear).getLayoutParams(); 
LinearLayout manager = (LinearLayout) rootView.findViewById(R.id.list_linear); 
lp.height = 45 * values.length; 
manager.setLayoutParams(lp); 

listView.setAdapter(adapter); 

Мой XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#BBDEFB" 
android:padding="3dp" 
android:id="@+id/movie_description_container"> 

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="225dp" 
    android:id="@+id/movie_detail_hero_image" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentLeft="true" 
    android:gravity="top" 
    android:src="@drawable/sample_1"/> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="movie title" 
    android:id="@+id/movie_detail_title" 
    android:layout_alignBottom="@+id/movie_detail_hero_image" 
    android:backgroundTint="@color/background_floating_material_dark" 
    android:textSize="36dp" 
    android:textColor="#BBDEFB" 
    android:background="#a3000000" 
    android:layout_above="@id/movie_detail_hero_image" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginLeft="3dp" 
    android:layout_marginRight="3dp" 
    android:paddingLeft="18dp"/> 

<ImageView 
    android:layout_width="175dp" 
    android:layout_height="215dp" 
    android:id="@+id/movie_detail_poster" 
    android:src="@drawable/sample_0" 
    android:layout_below="@+id/movie_detail_title" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_margin="12dp" 
    android:gravity="left"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="date" 
    android:textSize="22dp" 
    android:id="@+id/movie_detail_date" 
    android:layout_centerVertical="true" 
    android:layout_below="@id/movie_detail_hero_image" 
    android:layout_alignRight="@+id/movie_detail_hero_image" 
    android:layout_marginRight="12dp" 
    android:layout_marginTop="32dp"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="Rating:" 
    android:textSize="22dp" 
    android:id="@+id/movie_detail_rating" 
    android:layout_below="@+id/movie_detail_date" 
    android:layout_alignRight="@+id/movie_detail_date" 
    android:layout_alignEnd="@+id/movie_detail_date" 
    android:layout_marginTop="6dp" /> 

<RatingBar 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/ratingBar" 
    android:numStars="4" 
    android:nestedScrollingEnabled="true" 
    android:maxWidth="77dp" 
    android:layout_below="@+id/movie_detail_rating" 
    android:layout_alignRight="@+id/movie_detail_rating" 
    android:layout_alignEnd="@+id/movie_detail_rating" 
    android:layout_marginTop="3dp"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="Synopsis" 
    android:id="@+id/movie_detail_synopsis_header" 
    android:layout_below="@+id/movie_detail_poster" 
    android:layout_alignLeft="@+id/movie_detail_poster" 
    android:layout_alignStart="@+id/movie_detail_poster" /> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="description" 
    android:id="@+id/movie_detail_synopsis" 
    android:layout_below="@+id/movie_detail_synopsis_header" 
    android:layout_alignLeft="@+id/movie_detail_synopsis_header" 
    android:layout_alignStart="@+id/movie_detail_synopsis_header" 
    android:layout_margin="6dp"/> 

<ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageButton_Favorite" 
    android:layout_below="@+id/ratingBar" 
    android:layout_alignRight="@+id/ratingBar" 
    android:src="@drawable/ic_favorite_white_24dp" 
    android:maxWidth="45dp" 
    android:maxHeight="45dp" 
    /> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/list_linear" 
    android:layout_below="@id/movie_detail_synopsis"> 
    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="45dp" 

     android:id="@+id/list_view2"/> 
</LinearLayout> 
+0

Вы имеете не устанавливайте ориентацию LinearLayout, содержащую ваш список. Значение по умолчанию - горизонтальное. Кроме того, просмотр списка прокручивается. Вам не нужно делать список выше, чтобы освободить место для большего количества предметов. –

ответ

0

На самом деле вы можете установить высоту ListView до размера Чайлдерс с помощью этого метода

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

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), 
      MeasureSpec.UNSPECIFIED); 
    int totalHeight = 0; 
    View view = null; 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     view = listAdapter.getView(i, view, listView); 
     if (i == 0) 
      view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, 
        LayoutParams.WRAP_CONTENT)); 

     view.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += view.getMeasuredHeight(); 
    } 
    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight 
      + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
}