일반적으로 ScrollView 안에 ListView 가 들어가는 형태에 UI를 만들어야 하지 않지만....
어쩔수 없이 ScrollView 안에 ListView 가 들어가야 한다면 아래 코드를 참고하자..
ListView
이유를 알 수 없지만...
ListView Item에 최상위 뷰가 ReleativeLayout 이면 NullPointerException이 발생한다..다른 레이아웃으로 교체 후에 사용하자.
// MeasureSpec.AT_MOST : wrap_content 에 매핑되며 뷰 내부의 크기에 따라 크기가 달라진다.
// MeasureSpec.EXACTLY : fill_parent, match_parent 로 외부에서 미리 크기가 지정되었다.
// MeasureSpec.UNSPECIFIED : Mode 가 설정되지 않았을 경우. 소스상에서 직접 넣었을 때 주로 사용된다.
public void resizeListView(ListView listView, int measureSpec) {
ListAdapter adapter = listView.getAdapter();
if (adapter == null) {
// do nothing return null
return;
}
// set listAdapter in loop for getting final size
int totalHeight = 0;
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), measureSpec);
// 각 item view 마다 크기가 다를 수 있음으로 각 item view 의 size 만큼 더한다.
for (int size = 0; size < adapter.getCount(); size++) {
View listItem = adapter.getView(size, null, listView);
listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += listItem.getMeasuredHeight();
}
// setting listview item in adapter
ViewGroup.LayoutParams params = listView.getLayoutParams();
// divider 도 크기가 있기 때문에 따로 더해줘야 한다.
params.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
listView.setLayoutParams(params);
// layout view 모양이 바꼇다고 알려준다. onlayout 이 호출 된다.
listView.requestLayout();
// print height of adapter on log
}
resizeListView(listView, MeasureSpec.UNSPECIFIED);
ExpandableListView
public void resizeExpandableListView(ExpandableListView listView, int group) {
ExpandableListAdapter adapter = listView.getExpandableListAdapter();
if (adapter == null) {
return;
}
int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(),
View.MeasureSpec.AT_MOST);
int totalHeight = 0;
for (int groupIndex = 0; groupIndex < adapter.getGroupCount(); groupIndex++) {
View listItem = adapter.getGroupView(groupIndex, false, null, listView);
listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += listItem.getMeasuredHeight();
if (((listView.isGroupExpanded(groupIndex))
&& (groupIndex != group))
|| ((!listView.isGroupExpanded(groupIndex))
&& (groupIndex == group))) {
for (int childIndex = 0; childIndex < adapter.getChildrenCount(groupIndex);
childIndex++) {
View item = null;
if (childIndex >= adapter.getChildrenCount(groupIndex) - 1) {
item = adapter.getChildView(groupIndex, childIndex, true, null, listView);
} else {
item = adapter.getChildView(groupIndex, childIndex, false, null, listView);
}
item.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += item.getMeasuredHeight() + listView.getDividerHeight();
}
}
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (adapter.getGroupCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
resizeExpandableListView(listView, group);
참고..
http://blog.naver.com/PostView.nhn?blogId=thdeodls85&logNo=150173868905&redirect=Dlog&widgetTypeCall=true
http://www.moltak.net/2014/04/android-expandablelistview-in-scrollview.html
'android' 카테고리의 다른 글
Spannable 이용하여 특정 문자열 색, 사이즈 변경... (0) | 2014.09.03 |
---|---|
1000 단위 콤마찍기... (0) | 2014.09.02 |
유연성 있는 ViewHolder Pattern (0) | 2014.09.02 |
파일 용량 표시... (0) | 2014.09.02 |
Fragment에서 startActivityForResult 하여 onActivityResult 결과 받기... (1) | 2014.09.02 |
댓글