뜻하지 않게, 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;
	}
});

'안드로이드 > Component' 카테고리의 다른 글

ConstraintLayout -2 체인  (0) 2017.06.20
Constraint Layout -1  (0) 2017.06.19
ListView Background Selector  (0) 2015.03.20
안드로이드 ViewPager 및 Fragment ActionBar  (0) 2014.08.27
EditText 글자수 제한  (0) 2014.07.17
Posted by 자바리즘
,