2

私はViewPagerを持っており、viewPager.setCurrentItem(index, true)を呼び出してスクロールをスムーズにします。 ViewPagerは、その内部にRecyclerViewを持つフラグメントで構成されています。Android:Viewpagerはスクロールをスムーズにしません

私はsetCurrentItemと呼んでいます。ユーザーがフラグメントのヘッダーで右または左にスワイプした後、ビューページャーは次のアイテムにスクロールします。しかし、問題は、ビュー・ページャーが(毎回)スムーズに次のフラグメントにスクロールしないことです。私はここで見つけた解決策を試しましたが、実際にはうまくいきませんでした。

ときどき(主に右から左に行くと)滑らかなスクロールが行われますが、ほとんどはうまくいきません。

EDIT:

はここに私のコードです:

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

... 

カスタムタッチリスナー:

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

} 

私はこれがあなたが必要とするすべてであると思います。

+0

コードを追加してください。 –

+0

@MiladYarmohammadiコードが追加されました。 – Cimoe

答えて

0

ViewPagerがスムーズにスクロールしない理由を知りました。 ViewPager内に単一のFragmentsが作成されるのは時間がかかりすぎるため、ViewPagerが毎回スムーズにスクロールしないのはそのようです。フラグメントは既に初期化されているためスムーズにスクロールすることができますが、必ずしもそうであるとは限りません。

私は素早くフラグメントの作成をしなければならないようです。

関連する問題