2014-09-04 4 views
4

Я пытаюсь создать сворачиваемый календарь.ViewPager с расширяемым ребенком

Я использую пользовательский calendarView в ViewPager, поэтому, когда кнопка expand/collapse нажата, мой анимационный календарь calendarView сворачивает все календарные недели, кроме одного.

Цель - пропустить месяц при расширении (который работает так, как я хочу), и проведите недели, когда рухнет.

Ниже календарного вида является ListView с некоторыми событиями, когда пользователь сворачивает календарь - высота списка должна измениться.

Проблема в том, что я пытаюсь свернуть calendarView в ViewPager, он не меняет высоту.

calendarView - это LinearLayout с дочерними представлениями, когда он не находится в ViewPager, он анимирует и меняет размер.

Я использую небольшой фрагмент кода, чтобы установить высоту ViewPager к нему детей

@Override 
protected void onMeasure(int widthMeasureSpec, int 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(); 
     if(h > height) height = h; 
    } 

    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); 

    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

Я пытался переопределить onMeasure на calendarView, использовали различные анимации, пытались, чтобы изменить ViewPager расположение непосредственно, но не повезло.

Пожалуйста, помогите мне с этой проблемой, возможно, есть подсказка.

Я нашел this, this, this, и много больше вопросов

Моего вопрос очень похож на this вопрос

ответ

6

Итак, наконец, я понял, как решить мою проблему, возможно, это будет полезно.

вот мой PagerAdapter:

class CustomAdapter extends PagerAdapter { 

    private View mCurrentView; 

    ... 

    // Saving current active item 
    @Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) { 
     mCurrentView = (View) object; 
    } 

    public View getCurrentItem() { 
     return mCurrentView; 
    } 

} 

И это мой ViewPager класс

class CustomViewPager extends ViewPager { 

    private CustomViewPagerAdapter mAdapter; 

    ... 

    // Set ViewPager height to currentItem 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

     int height = 0; 
     View v = mAdapter.getCurrentItem(); 
     if(v != null) { 
      v.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
      height = v.getMeasuredHeight(); 
     } 

     heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); 

     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 

С этим я могу свернуть/развернуть ViewPager Чайлдс и будет измерять ее высоту правильно, и он измеряет при изменении страницы с небольшой задержкой.

+0

Большое спасибо, ваше решение действительно помогло. Он немного изменил работу с FragmentPagerAdpter. –

+0

Эй, парень, я хочу попробовать ваше решение, но я задаюсь вопросом, как использовать ваш адаптер, спасибо – Tony

+0

Используйте ваш пейджер-адаптер, как всегда, просто добавляйте код, указанный выше. – Jonez

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