Reputation: 141
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
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
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
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
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