Skip to content

Instantly share code, notes, and snippets.

@egslava
Created August 12, 2014 12:28
Show Gist options
  • Star 56 You must be signed in to star a gist
  • Fork 12 You must be signed in to fork a gist
  • Save egslava/589b82a6add9c816a007 to your computer and use it in GitHub Desktop.
Save egslava/589b82a6add9c816a007 to your computer and use it in GitHub Desktop.
Wrap content height ViewPager (Android)
package org.cnii.layoutloader.ui;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
/**
* Special thanks to Daniel López Lacalle for his response
* (http://stackoverflow.com/questions/8394681/android-i-am-unable-to-have-viewpager-wrap-content/20784791#20784791)
* */
public class WrapContentHeightViewPager extends ViewPager {
public WrapContentHeightViewPager(Context context) {
super(context);
}
public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@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);
}
}
@ConCaRo
Copy link

ConCaRo commented Jan 10, 2017

Thanks for a ton.

@hotdudehvfun
Copy link

excellent. Works like a charm :)

@ilya-afanasev
Copy link

It doesn't work in my case, I should add super call before height calculation, because in first onMeasure call children count is zero

@DashrathAhir
Copy link

excellent. Works like a charm :)

@D330
Copy link

D330 commented Mar 9, 2018

in landscape orientation height are minimum height

@D330
Copy link

D330 commented Mar 11, 2018

problems with recyclerview childs. scroll don't working

@ashwinikmr
Copy link

Thanks! It saved me..

@Anil0319
Copy link

i need the height be as per my textview data.. currently it take height of the first index cell area height.
Please help

@afinas-em
Copy link

Thanks a lot.

@afinas-em
Copy link

But it is taking the height of the biggest child. What I need is to dynamically set the height. please help.

@saulmaos
Copy link

saulmaos commented May 17, 2018

// @afinas-em This is what i use to meaure the size dinamically. Sorry for the styling but i'm new using github

@OverRide
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;

    //View v = getChildAt(getCurrentItem());
    TabsCircleAdapter tabsCircleAdapter = (TabsCircleAdapter) getAdapter();
    //View v = tabsCircleAdapter.getCurrentItem(getCurrentItem());
    View v = null;
    if (tabsCircleAdapter != null) v = tabsCircleAdapter.getCurrentItem(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);
       
    } else {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

@imrankhanluhar
Copy link

really save

@geniushkg
Copy link

This works and height is of tallest child, incase you need diffrent height then save height as interger array and request layout on page change listener, and populate height accordingly.

`public class WrapContentHeightViewPager extends ViewPager {

private int mCurrentPagePosition = 0;

private int[] heightArr = new int[3];  // allocating memory to array
public WrapContentHeightViewPager(Context context) {
    super(context);
}

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

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

    int mode = MeasureSpec.getMode(heightMeasureSpec);
    if (mode == MeasureSpec.UNSPECIFIED || mode == MeasureSpec.AT_MOST) {
        // super has to be called in the beginning so the child views can be initialized.
       // super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int height = 0;
        int numOfElements = getChildCount();
        for (int i = 0; i < numOfElements; i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            height = h;
            //if (h > height) height = h;
            heightArr[i]=height;
        }
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightArr[mCurrentPagePosition], MeasureSpec.EXACTLY);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

public void reMeasureCurrentPage(int position) {
    mCurrentPagePosition = position;
    requestLayout();
}

}
`

This is for reference not orginal by me, credit goes to TheLittleNaruto and many devs from stack overflow.

@hiten
Copy link

hiten commented Sep 20, 2018

This is what is used. Just add a flag of fillViewPort

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true"
            >

          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical"
              >
<android.support.design.widget.TabLayout
          android:id="@+id/tabLayout"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          />
      <android.support.v4.view.ViewPager
          android:id="@+id/case_data_view_pager"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          >
      </android.support.v4.view.ViewPager>
          </LinearLayout>
 </ScrollView>

@amrishkakadiya
Copy link

Some people are born to be awesome.!! Thank you.

@d1hamid
Copy link

d1hamid commented May 31, 2020

how i can use ? :(

@Retromantis
Copy link

Thanks, you saved me !!!

@robertocapah
Copy link

I have the same problem with @ilya-afanasev, childCount detected zero at first display, so it doesn't show until I tap the other tab. can anyone give advice?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment