2012-10-16 3 views
3

ListView가 무엇인지 알아 보겠습니다. ListView는 어댑터를 사용하여 하나의 ViewPager 만 포함하는 RelativeLayout을 부 풀립니다.ListView의 ViewPager - 동적으로 높이 측정 (어댑터에서 비정상적으로 증가 함)

어댑터의 getView에 사용자 정의 PagerAdapter가 ViewPager에 대해 인스턴스화되고 .setAdapter가 ViewPager에 호출됩니다. setAdapter가 호출 된 후 RIGHT가 반환되는 행을 반환하거나 뷰를 반환합니다. 그러면 ListView에서 해당 어댑터의 getView 메소드가 종료됩니다.

는 PagerAdapter에서 나는 이것은 호출기 어댑터, 아이 뷰 (페이지)를 설정하는 것을 기본적으로

public Object instantiateItem(View collection, int position) {} 

구현했습니다. 그것은 모든 어린이 뷰를 팽창시키고 설정 한 다음 뷰를 컬렉션에 추가합니다.

나는 문제가 사실을 반환에 행을 마친 후, PagerAdapter 여전히 아이를 설정 완료, ViewView ViewPager 비어 있으며 그렇게 화면에 그리는 것이라고 거짓말을 생각합니다. 내가 한 것은 기본적으로 해킹이라고 생각하는 것입니다. 을 ((라고

view.measure(MeasureSpec.makeMeasureSpec(widthMeasureSpecSize, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(heightMeasureSpecSize, MeasureSpec.UNSPECIFIED)); 
((Pager) collection).requestedHeight = view.getMeasuredHeight(); 

값 heightMeasureSpecSize 실제로 .setAdapter 전에 목록보기 어댑터 설정 공용 속성은 다음과 같습니다

나는 이런 식으로 뭔가를 사용하여 instantiateItem에서 처음으로 아이 뷰를 측정하려고 호출기) 컬렉션) .requestedHeight는 내가 확장했을 때 ViewPager 자체에서 만든 또 다른 속성입니다. 값이 설정되기 전에 기본값은 100입니다. 이 모든 코드와

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    super.onMeasure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(requestedHeight, View.MeasureSpec.AT_MOST)); 
} 

, 내가 된 onMeasure이 ViewPager에 호출 될 때마다 응용 프로그램을 실행할 때 ListView에 100 다음 다시 함께 목록에 ViewPager를 추가 할 것 : 나는 다음 된 onMeasure 방법과 같이 오버라이드 - onMeasure를 사용하여 계산하고 View Pager의 첫 번째 자식의 measuredHeight를 사용하여 항목을 다시 그립니다.

ViewPager에서 wrap_content가 깨 졌기 때문에이 모든 것이 있습니다. 이 일을하는 것보다 더 좋은 방법이 있을까요? 대단히 비효율적 인 것 같습니다. 내가 측정 한 후 높이를 조정

ViewTreeObserver viewTreeObserver = mViewPager.getViewTreeObserver(); 
    viewTreeObserver 
      .addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

       @Override 
       public void onGlobalLayout() { 

        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
          LinearLayout.LayoutParams.WRAP_CONTENT, 
          LinearLayout.LayoutParams.WRAP_CONTENT); 

        int viewPagerWidth = mViewPager.getWidth(); 
        float viewPagerHeight = (float) (viewPagerWidth * FEATURED_IMAGE_RATIO); 

        layoutParams.width = viewPagerWidth; 
        layoutParams.height = (int) viewPagerHeight; 

        mViewPager.setLayoutParams(layoutParams); 
        mViewPager.getViewTreeObserver() 
          .removeGlobalOnLayoutListener(this); 
       } 
      }); 

:

+0

나는 내 자신의 문제를 해결했습니다. 며칠 동안이 문제를 해결하고 돌아 오는 길에 해결책을 생각했습니다. 동시에 모든 시각을 팽창시켜야합니다. ViewPager와 그 모든 자식. 첫 번째 아이가 팽창 된 후에 그것을 측정 한 다음 ViewPager의 레이아웃 매개 변수를 동일하게 설정하십시오. 효과가있을 것입니다. –

답변

1

이 내 솔루션입니다. 희망이 도움이됩니다.

관련 문제