5

How can I disable the preloading in a ViewPager?

I have a ViewPager with 3 pages fragment in each page. So I don't want to load the next page and previous page. How can I disable this behaviour?

I tried

viewPager.setOffscreenPageLimit(1)

But this is not working.

and tried

@Override
public void setMenuVisibility(final boolean visible) {
    super.setMenuVisibility(visible);
    if (visible) {
        // do something nice here
    }
}

but RecyclerView which in next fragment show this

RecyclerView: No adapter attached; skipping layout

apologize for my English

Essam Goda
  • 141
  • 1
  • 3
  • 14
  • Have a look at this: http://stackoverflow.com/questions/10073214/viewpager-setoffscreenpagelimit0-doesnt-work-as-expected – Gennadii Saprykin Aug 26 '16 at 17:33
  • unfortunately not working,I want to only load 1 (current only) fragment not 2 – Essam Goda Aug 26 '16 at 17:36
  • I don't think you can disable preloading of the next page because this is how `ViewPager` was designed. The only option I can think of here: when you are loading a page, check whether the fragment is "current" or not. If it is, then load, if not, then just ignore the call and do nothing. – Gennadii Saprykin Aug 26 '16 at 18:00

4 Answers4

6

The minimum value for the off screen limit is 1. what you can do is, handle it yourself using the "setUserVisibleHint" method in your fragments, like for instance.

public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser)
           // execute your data loading logic.
}
Ahmed Ashraf
  • 2,795
  • 16
  • 25
1

I think its not possible with ViewPager. To swipe between two pages both the pages should be visible. (Should be preloaded). You can try your own view pager to swipe without preload. Also Check This

Imran Ali
  • 321
  • 2
  • 13
0

Here is an example Android application that extends the Fragment Life Cycle with two new methods: onResumeViewPage() and onPauseViewPage() that are called when the user swipes between fragments. If you put your code in onResumeViewPage() it should work.

See: Slider Android Application in BitBucket.

fishjd
  • 1,617
  • 1
  • 18
  • 31
0

I have to use animation with delay on different pages, with view pager, it was preloading the page and also the delay of next page , so i used OnSwipeTouchListener on Constraint Layout & got the callbacks of swipe Left and right.

public class OnSwipeTouchListener implements View.OnTouchListener{

    private final GestureDetector gestureDetector;

    public OnSwipeTouchListener (Context ctx){
        gestureDetector = new GestureDetector(ctx, new GestureListener());
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight();
                        } else {
                            onSwipeLeft();
                        }
                        result = true;
                    }
                }
                else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        onSwipeBottom();
                    } else {
                        onSwipeTop();
                    }
                    result = true;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public void onSwipeRight() {
    }

    public void onSwipeLeft() {
    }

    public void onSwipeTop() {
    }

    public void onSwipeBottom() {
    }
}

In MainActivity - (you will get the swipe callbacks here and set different items to the views in the swipe override methods)

constraintLayout.setOnTouchListener(new OnSwipeTouchListener(this){
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return super.onTouch(v, event);
            }

            @Override
            public void onSwipeRight() {
                super.onSwipeRight();
            }

            @Override
            public void onSwipeLeft() {
                super.onSwipeLeft();
            }

            @Override
            public void onSwipeTop() {
                super.onSwipeTop();
            }

            @Override
            public void onSwipeBottom() {
                super.onSwipeBottom();
            }
        });
Himanshu HC
  • 47
  • 1
  • 5