뜻하지 않게, ScrollView 안에 ListView 등의 리스트 형식의 Element를 넣어야 할 때가 있다.
안드로이드 권고사항은 아니지만, UI 를 이렇게 설계했다면 어쩔 수 없이 넣어야 하는데. (개인적인 생각으로는 이런 UI는 지양한다. 대체 누가 이렇게 설계하는거야 -_-^ 짱나게)
암튼, 그럼에도 방법은 있다.
ScrollVIew 의 속성중에 android:fillViewport="true" 로 속성을 주고,
Java code단에서 아래와 같은 메소드를 작성해주고 호출해준다.
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
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);
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();
}
이 메소드를 listview의 setApdater 직 후에 넣어준다.
ExpandableListView 의 경우는 setAdapter 직 후에 넣어주고, setOnGroupClickListener 를 선언하고, onGroupClick 안에서 한번 더 호출해준다.
expandableListView.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
setExpandableListViewHeight(parent, groupPosition);
return false;
}
});