2013-06-25 4 views
0

ScrollView에서 사용할 수있는 최대 높이를 어떻게 결정합니까?ScrollView의 최대 높이가 필요합니다.

ListView와 같은 것을 구현하고 싶습니다. 따라서 레이아웃 목록 항목에 사용할 수있는 공간의 양을 알고 싶습니다. TestList가 하위 클래스 인 ScrollView 인 단순한 LinearLayout이있는 응용 프로그램을 생각해보십시오. TestList에는 런타임에 추가 된 단일 LinearLayout이 포함되어 있습니다.

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="top" /> 

    <com.example.testsimplelist.TestList 
     android:id="@+id/test_list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="bottom" /> 

</LinearLayout> 

내 질문은 : "test_list"에 항목을 추가 할 때 보이는 수직 공간의 크기입니다.

(이미 ListView 경로를 사용했지만 너무 많은 속도 저하 현상을 일으키는 getView에 대한 과도한 호출 문제가 있습니다 .LowView에서 사용 사례가 많이 줄어들었기 때문에 ListView에 문제 주위에 해킹보다 일)

가 여기에 내가 무엇을 시도했다입니다 : ScrollView.onMeasure의 PARAMS를 사용하여

1) - 효과적으로 무한 쓸모가 있기 때문이다..

2) ScrollView 내부의 레이아웃 높이 사용 - 내용이 없으므로 처음에는 0입니다. 즉 높이는 내용에 따라 다릅니다.

+0

"*을하지만 너무 속도 degregation * 원인의 getView 과도한 통화 문제로 실행하고 있습니다"- 당신이 뭔가를 아주하고있는 것처럼 그 소리 잘못된; 'ListView'는 속도를 위해 만들어졌습니다. 1)에 대해서 : 그것은 매개 변수가 일반 int가 아니고 View.MeasureSpec에 따라 인코딩되기 때문입니다. 꼭 [Custom Components guide] (http://developer.android.com/guide/topics/ui/custom-components.html)를 읽으십시오. –

+0

속도 저하 - 동의합니다. 그러나 ListView 자체가 효율적일 수 있지만 배치하는 것은 여러 번 레이아웃하고 점차적으로 레이아웃을 발생시키는 것입니다. 따라서 한 항목에 대해 getView를 호출하고, 재사용하고, 두 번째 항목에 대해 getView를 호출하고, 재순환하는 등의 효과가있었습니다. 목록을 채우기 위해 getView를 세 번째 연속 호출하기 전에 두 번 수행했습니다. 나는 진정한 원인을 발견 할지라도 깨지기 쉽다. 내 수정 내용은 안드로이드의 미래 변화에 독립적 일 수 없다. 누가 알 잖아 ... –

+0

ScrollView.getMeasuredHeight()가 작동하는 것으로 보입니다. 하지만 TestList 위젯의 무게를 1 (다른 모든 것은 0)으로 설정해야했습니다. –

답변

1

안정적으로 작동합니다 (지금까지). 열쇠는 높이 값 사용하기 전에 MeasureSpec 모드를 확인하는 것입니다 :

@Override 
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) 
{ 
    super.onMeasure (widthMeasureSpec, heightMeasureSpec); 

    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    if (heightMode == MeasureSpec.EXACTLY) 
    { 
    int heightSpec = getMeasuredHeight(); 
    fillView (heightSpec); 
    } 
} 
+0

이 코드는 정확히 무엇을합니까? 스크롤 뷰에 "최대 높이"변수가 주어져서 높이에 맞는 내용을 감싸고 어린이가 필요로하는 높이만큼 가져갈 수 있지만이 크기보다 크지 않도록 할 수 있습니까? –

+0

실제로 ScrollView가 아닌 ​​ViewGroup을 사용했습니다. 자식 뷰를 만드는 것은 매우 비쌉니다. 목록이 길면 현재 표시된 내용에 대한 충분한 뷰를 만들고 사용자가 스크롤하면서 "재생"하기를 원합니다. "높이의 랩 콘텐츠"가 무엇을 의미하는지 확신 할 수 없습니다. –

+0

AdapterViews (ListViews)와 잘 알려져 있고 어떻게 작동하는지 알려드립니다. 나는 다른 것에 대해 물어 본다. 여기에 내가 작성한 게시물이 있습니다. http://stackoverflow.com/questions/22984740/how-to-set-a-max-height-of-a-any-kind-of-view. 당신이 이해하기를 바랍니다. –

관련 문제