Android:Viewpager 不平滑滚动

标签 android android-fragments android-viewpager smooth-scrolling

我有一个 ViewPager,我希望它通过调用 viewPager.setCurrentItem(index, true) 来平滑滚动。 ViewPager 由内部有 RecyclerView 的 fragment 组成。

当用户在 fragment 的标题上向右或向左滑动时,我调用 setCurrentItem,然后查看分页器应滚动到下一个项目。但问题是 View 寻呼机不会(每次)平滑滚动到下一个 fragment 。我已经尝试了一些我在这里找到的解决方案,但没有一个确实有效。

奇怪的是,有时(主要是当我从右向左移动时)它确实可以平滑滚动,但大多数情况下它不起作用。

编辑:

这是我的代码:

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

}

希望这就是您所需要的。

最佳答案

我发现了为什么 ViewPager 每次都滚动不流畅。似乎在 ViewPager 中创建单个 Fragments 花费的时间太长,这就是 ViewPager 每次滚动不流畅的原因。它可能会平滑滚动,因为 fragment 已经被初始化,但情况并非总是如此。

看来我必须加快 fragment 的创建速度。

关于Android:Viewpager 不平滑滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45674470/

相关文章:

android - 如何从服务器在 ViewPager 内的 VideoView 上播放视频

android - 使用 Wifi Direct 发现对等点的替代方法,因为它需要两部手机都运行 WiFi Direct 发现

Android:处理 ViewPager 和数据密集型 fragment 的正确方法?

带有 RecyclerView 的 Android ViewPager 在 BottomSheet 中工作不正确

android - 使用抽屉导航旋转时 fragment 发生变化

android - 我们应该使用 setTargetFragment() 吗?我认为 Fragments 不应该相互通信

android - TabFragment 中的 ViewPager 未再次加载

android - 在 Android fragment 中使用 onBackPressed()

android - 如何在设计编辑器预览中显示工具栏中的后退箭头?

Android Jetpack Compose TextField 禁用键盘自动建议