Android:Viewpager不流畅滚动

Android:Viewpager不流畅滚动

问题描述:

我有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

我发现为什么ViewPager每次都不顺畅滚动。好像在ViewPager中创建单一的Fragments需要很长时间,这就是为什么ViewPager每次都不能平滑滚动的原因。它可以顺利滚动,因为碎片已经被初始化,但情况并非总是如此。

好像我必须更快地创建碎片。