ScroView 안에 ListView가 들어가 view가 안그려질때...

일반적으로 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

댓글