본문 바로가기

Programming/Android

[Android] ScrollView 안에 ListView height 지정

[Android] ScrollView안에 ListView를 넣는 경우


ScrollView 안에 ListView를 넣을 경우 ListView의 높이가 지정이 되지 않는 경우가 있다.
ScrollView와 ListView 둘 다 vertical scroll를 가지고 있기 때문에 꼬이는 현상이 일어나 ListView의 높이가 원하는대로 지정되지 않는다.


-example-green.svg

12345678<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</ScrollView>

Android Developer

 You should never use a ScrollView with a ListView, because ListView takes care of its own vertical scrolling. Most importantly, doing this defeats all of the important optimizations in ListView for dealing with large lists, since it effectively forces the ListView to display its entire list of items to fill up the infinite container supplied by ScrollView.



Solution

  • 첫번째 방법 : ListView의 header에 ScrollView의 내용을 넣는다.

  • 두번째 방법 : ListView와 ScrollView를 분리해서 사용한다.

123456789101112131415<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">
        </ScrollView>
        <ListView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
</LinearLayout>
  • 세번째 방법 : ListView의 height를 계산
12345678910111213141516171819202122232425public void setListViewHeightBasedOnItems(ListView listView) {
 
      // Get list adpter of listview;
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null)  return;
 
        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();
}