장삼의 착한코딩

[Android] ScrollView안에 ListVIew 넣을 시 Height 문제 본문

Android

[Android] ScrollView안에 ListVIew 넣을 시 Height 문제

wkdgusdn3 2015. 11. 4. 13:05

ScrollView에 ListView를 넣고 adapter를 통해 item을 넣을 시, ListView의 Height가 제대로 설정되지 않는 경우가 있다. 이럴 땐 Java 코드에서 직접 ListView의 Height를 직접 설정해주어야 한다.


우선 xml 코드는 아래와 같다. ListView의 Height를 wrap_content로 설정해 준다.

1
2
3
4
5
6
7
8
9
10
<ScrollView    
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/ListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
</ScrollView>
cs


그 후 아래의 메소드를 작성한다. ListView와 연결되어 있는 adpater의 item의 개수를 통해 ListView의 height를 설정해주는 메소드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }
 
        int totalHeight = 0;
        int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.AT_MOST);
 
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
            totalHeight += listItem.getMeasuredHeight();
        }
 
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
    }
 
cs


그 후 ListView의 Adapter를 설정한 후 setListViewHeightBaseOnchildren 메소드를 실행하여 ListView의 Height를 설정해주면 된다.

1
2
listView.setAdapter(adapter);
setListViewHeightBasedOnChildren(listView);
cs


8 Comments
댓글쓰기 폼