ListView 2개를 ScrollView로 감싸서 ListView2개가 ScrollView 높이를 초과하게 되면 스크롤 되어 보여지게 UI를 구성했습니다.
문제는 ListView 2개의 heigh를 wrap_content나 match_parent를 주고 ScrollView로 감싸게 되면 ScrollView에서는 ListView의 height를 제대로 인식하지 못해서 ScorllView안의 ListView들이 제대로된 height 만큼 표시되지 않고 잘려서 표시되게 됩니다.
그렇다고 ListView에 heigh를 고정 크기로 지정해주게 되면 정작 ListView의 아이템 개수에 맞게 ListViewt를 표시 할수 없는 문제가 생깁니다.
그래서 ListView를 제대로 표시할 수 있는 방법을 찾아보니 ListView의 초기화 및 Item(data)을 갱신한후 ListView의 height를 계산하여 ListView에 LayoutParams을 설정하는 방법이 있더군요 이방법을 적용해보니 ListView가 제대로 표시되고 스크롤도 가능하게 됩니다.
소스코드를 공유 하자면
protected void onCreate(Bundle savedInstanceState) { ListView listview1 = (ListView) view.findViewById(R.id.list1); ArrayAdapter<Data> adapter = new ArrayAdapter<Data>(this, R.layout.simple_list_item, listData1); listview1.setAdapter(adapter); ListView listview2 = (ListView) view.findViewById(R.id.list2); adapter = new ArrayAdapter<Data>(this, R.layout.simple_list_item, listData2); listview2.setAdapter(adapter); setListViewHeightBasedOnChildren(listview1); setListViewHeightBasedOnChildren(listview2); } public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); listView.requestLayout(); }
리스트 뷰가 갱신될때 setListViewHeightBasedOnChildren() 호출을 하게 되면 ListView를 ScrollView로 감싸게 UI를 구성하더라도 ListView 정상적으로 표시되고 스크롤이 되게 됩니다.