Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ViewPager in ScrollView

Tags:

I need to have a ViewPager inside a ScrollView but ViewPager just does not appear when it's in ScrollView, everything is ok when i don't use ScrollView.

I've seen a couple questions like this being asked here on stackoverflow or on other sites and all of them have been answered that you have to put android:fillViewport="true" to your scrollview to fix the problem, but this solution doesnt work for me, ViewPager still does not appear even if i have android:fillViewport="true" in my ScrollView.

I guess something got changed in the android api's or something and this solution doesn't work anymore, does anyone know how i could possibly make a ViewPager appear in a ScrollView?

UPDATE: A working ScrollView layout XML:

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true">


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">

            <android.support.v4.view.ViewPager
                android:id="@+id/itemsViewPager2"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >
            </android.support.v4.view.ViewPager>
    </LinearLayout>
 </ScrollView>
like image 746
boogieman Avatar asked Jan 27 '12 13:01

boogieman


People also ask

What does a ViewPager do?

Layout manager that allows the user to flip left and right through pages of data. You supply an implementation of a PagerAdapter to generate the pages that the view shows. ViewPager is most often used in conjunction with android.

How do I use ViewPager?

You can create swipe views using AndroidX's ViewPager widget. To use ViewPager and tabs, you need to add a dependency on ViewPager and on Material Components to your project. To insert child views that represent each page, you need to hook this layout to a PagerAdapter .

What is fillViewport in ScrollView?

fillViewport allows scrollView to extend it's height equals to the full height of device screen's height in the cases when the child of scroll view has less height.


3 Answers

I ran into a similar problem in the past. A View-Pager must have a set height (it cannot wrap-content). Since a ViewPager loads separate pages, and not all at once, it won't know what 'wrap-content' actually means. Setting the layout_height to fill_parent or a set dp allows the ViewPager to statically set it's height and react more accordingly within other layouts.

like image 118
jbenowitz Avatar answered Sep 20 '22 15:09

jbenowitz


public class YourScrollableViewPager extends ViewPager {

private static final int MATCH_PARENT = 1073742592;

private int currentPageNumber;
private int pageCount;

public YourScrollableViewPager(Context context) {
    super(context);
    prepareUI();
}

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

private void prepareUI() {
    setOffscreenPageLimit(pageCount);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int height = 0;
    if (getChildCount() != 0) {
        View child = getChildAt(currentPageNumber);
        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);
}

public void onPrevPage() {
    onMeasure(MATCH_PARENT, 0);
}

public void onNextPage() {
    onMeasure(MATCH_PARENT, 0);
}}
like image 44
Andrew Dmytrenko Avatar answered Sep 20 '22 15:09

Andrew Dmytrenko


I found solution for mine using "HorizontalScrollView" instead of ScrollView.

First create activity_main.xml with below code, where you define ViewPager.

        <?xml version="1.0" encoding="utf-8"?>
           <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"
               android:orientation="vertical" >

            <android.support.v4.view.ViewPager
               android:id="@+id/pager"   
               android:layout_width="match_parent"
               android:layout_height="match_parent" />
           </LinearLayout>

And later create another left.xml for defining your HorizontalScrollView :

        <?xml version="1.0" encoding="utf-8"?>
        <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res
              /android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >

           <ImageView
              android:id="@+id/imageView1"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:src="@drawable/ic_launcher" />
        </HorizontalScrollView>
like image 30
TANZ Avatar answered Sep 19 '22 15:09

TANZ