Essam Goda
Essam Goda

Reputation: 141

I want to disable preloading next page in a ViewPager

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

Upvotes: 5

Views: 6271

Answers (4)

Himanshu HC
Himanshu HC

Reputation: 87

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();
            }
        });

Upvotes: 0

fishjd
fishjd

Reputation: 1687

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.

Upvotes: 0

Imran Ali
Imran Ali

Reputation: 321

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

Upvotes: 1

Ahmed Ashraf
Ahmed Ashraf

Reputation: 2835

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.
}

Upvotes: 7

Related Questions