2

我有ViewPager,我希望它通過調用viewPager.setCurrentItem(index, true)來平滑滾動。 ViewPager由其中包含RecyclerView的片段組成。Android:Viewpager不流暢滾動

當用戶在片段的標題上向右或向左滑動,然後查看尋呼機應滾動到下一項時,我撥打setCurrentItem。但問題是視圖尋呼機不會(每次)平滑滾動到下一個片段。我嘗試了一些我在這裏找到的解決方案,但沒有真正起作用。

奇怪的是,有時(大多數時候我從右到左走)它確實平滑滾動,但大多數它不起作用。

編輯:

這裏是我的代碼:

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每次都不能平滑滾動的原因。它可以順利滾動,因爲碎片已經被初始化,但情況並非總是如此。

好像我必須更快地創建碎片。