2015-01-14 2 views
0

Возможно, я не могу объяснить проблему при заголовке.Динамическая высота Viewpager для всего фрагмента (как календарь Google)

Я работаю над календарным заявлением, разбиение на страницы этого календаря производится ViewPager. Во-первых, я не мог укрепить высоту ViewPager. Он заполнил всю страницу (содержимое Wrap не работало), поэтому я написал пользовательский просмотрщик, но появилась новая проблема.

Как показано ниже, некоторые месяцы в календаре имеют 6 линий, но в некоторых месяцах есть 7 линий в gridview. Она изменяется в соответствии с началом дня, общий день в месяц и т.д.

enter image description here

Я хочу, чтобы увеличить размер если количество номер строки 7 или сократить, если счетчик номер строки 6. календарь Google может сделай это.

Это мой CustomViewPager ниже.

public class CustomCalendarViewPager extends ViewPager { 
    public CustomCalendarViewPager(Context context) { 
     super(context); 
    } 

    public CustomCalendarViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

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

     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     int height = 0; 
     for (int i = 0; i < getChildCount(); i++) { 
      View child = getChildAt(i); 
      child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
      int h = child.getMeasuredHeight(); 
      int leap_space = Math.round((h/4)); 
      if (h > height) height = (h * 7) + leap_space; 

     } 
     heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 

Если вы хотите получить больше кода, я могу отредактировать этот вопрос.

спасибо.

EDIT

calendar_pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      @Override 
      public void onPageSelected(int position) { 
       System.out.println("onPageSelected " + position); 
       calendar_pager.requestLayout(); 
       calendar_pager.invalidate(); 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 

ответ

0

настроить OnPageChangeListener на ViewPager, и в onPageSelected переопределение, вызовите requestLayout и invalidate, чтобы заставить пейджера повторно измерить его высоту.

Внутри onMeasure используйте текущий элемент для установки высоты.

+0

Я вызвал функции requestLayout() и invalidate() в onOpageSelected, но я не понимаю, что я сделаю в onMeasure. Я редактировал свой вопрос. –

+0

В основном вместо того, чтобы перебирать все элементы, чтобы получить высоту, просто получить высоту элемента по индексу getCurrentItem() –

+0

Функция getCurrentItem() возвращает только текущую позицию. Я пробовал методы onMeasure() и setMeasuredDimension(). Я читал это => http://developer.android.com/reference/android/view/View.html и this => http://developer.android.com/guide/topics/ui/how-android-draws. html Plase вы можете сказать мне, что я должен делать в onMeasure(). Я боролся в течение 4 часов: D –

Смежные вопросы