2

J'ai un ViewPager et je veux qu'il lisse le défilement en appelant viewPager.setCurrentItem(index, true). Le ViewPager se compose de fragments qui ont RecyclerView à l'intérieur d'eux.Android: Viewpager ne lisse pas le défilement

J'appelle le setCurrentItem lorsque l'utilisateur glisse à droite ou à gauche sur l'en-tête du fragment et que le téléavertisseur doit ensuite passer à l'élément suivant. Mais le problème est que le pager de vue ne défile pas (à chaque fois) vers le fragment suivant. J'ai essayé quelques solutions que j'ai trouvées ici mais qui n'ont pas vraiment fonctionné. Etrangement parfois (surtout quand je vais de droite à gauche) il fait défiler en douceur mais la plupart du temps cela ne fonctionne pas.

EDIT:

Voici mon code:

ViewPagerFragment:

... 

private void setViews(){ 
    header.setOnTouchListener(new OnSwipeTouchListener(getContext()) { 
     public void onSwipeRight() { 
      swipeRight(); 
     } 
     public void onSwipeLeft() { 
      swipeLeft(); 
     } 
    }); 
} 

private void swipeLeft(){ 
    final CustomSwipeViewPager viewPager = (CustomSwipeViewPager) getActivity().findViewById(R.id.list_view_pager); 
    final int currentItem = viewPager.getCurrentItem(); 
    if(currentItem < 4){ 
     Thread sepThread = new Thread(new Runnable(){ 

      public void run() 
      { 
       //Then, inside that thread, run a runnable on the ui thread. 
       //MyActivity.getContext() is a static function that returns the 
       //context of the activity. It's us.getContext()eful in a pinch. 
       getActivity().runOnUiThread(new Runnable(){ 

        @Override 
        public void run() { 

         viewPager.setCurrentItem(currentItem + 1, true); 

        } 

       }); 

      } 
     }); 


     sepThread.start(); 
    } 
} 

private void swipeRight(){ 
    final CustomSwipeViewPager viewPager = (CustomSwipeViewPager) getActivity().findViewById(R.id.list_view_pager); 
    final int currentItem = viewPager.getCurrentItem(); 
    if(currentItem > 0){ 
     Thread sepThread = new Thread(new Runnable(){ 

      public void run() 
      { 
       getActivity().runOnUiThread(new Runnable(){ 

        @Override 
        public void run() { 

         viewPager.setCurrentItem(currentItem - 1, true); 

        } 

       }); 

      } 
     }); 


     sepThread.start(); 
    } 
} 

... 

personnalisé tactile Listener:

public class OnSwipeTouchListener implements 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 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() { 
} 

} 

J'espère que cela est tout ce que vous avez besoin.

+0

ajoutez votre code, s'il vous plaît –

+0

@MiladYarmohammadi Code ajouté – Cimoe

Répondre

0

J'ai découvert pourquoi le ViewPager ne défile pas facilement à chaque fois. Il semble que la création de l'unique Fragments à l'intérieur de ViewPager prend trop de temps et c'est pourquoi le ViewPager ne défile pas régulièrement à chaque fois. Il peut défiler en douceur, car les fragments ont déjà été initialisés, mais ce n'est pas toujours le cas.

On dirait que je dois accélérer la création des fragments.