使用PagerAdapter中的getPageWidth时,Android ViewPager滚动问题只有一项

使用PagerAdapter中的getPageWidth时,Android ViewPager滚动问题只有一项,android,android-viewpager,android-pageradapter,Android,Android Viewpager,Android Pageradapter,我有一个带有自定义PagerAdapter的ViewPager,它覆盖了getPageWidth方法以返回0.3f,因此我可以在屏幕上显示多个页面,如以下博客中所建议的: 在这种情况下,ViewPager开始为空,用户开始按要求填充页面(图像)。图像从左到右填充。所有的工作都很好,页面都是手工创建的,当有多个图像时,很容易在它们之间滑动 但是,如果实例化的页面少于三个,则会出现问题。从右(无内容)到左的滑动手势会产生页面从左到右交替移动的闪烁,就像ViewPager试图将前几页向右移动,但后来

我有一个带有自定义PagerAdapter的ViewPager,它覆盖了getPageWidth方法以返回0.3f,因此我可以在屏幕上显示多个页面,如以下博客中所建议的:

在这种情况下,ViewPager开始为空,用户开始按要求填充页面(图像)。图像从左到右填充。所有的工作都很好,页面都是手工创建的,当有多个图像时,很容易在它们之间滑动

但是,如果实例化的页面少于三个,则会出现问题。从右(无内容)到左的滑动手势会产生页面从左到右交替移动的闪烁,就像ViewPager试图将前几页向右移动,但后来又转到其原始位置一样。这在整个手势中都会发生,离开手势时会停止。正如我所说,当页面足够覆盖整个屏幕宽度并且需要一个真正的滚动时,这种情况就不会发生


有什么想法吗?

我知道这是一个老问题,但我只是在寻找解决方案,突然发现(奇怪的是,它引用了这个问题)。无论如何,我能够根据他们的评论找到一个解决方案。基本思想是允许基于您设置的布尔标志状态的触摸事件

  • 在覆盖onInterceptTouchEvent和onTouchEvent时扩展ViewPager,使其仅在设置了标志的情况下调用super。我的班级是这样的:

    public class MyViewPager extends ViewPager {
    
        private boolean isPagingEnabled = false;
    
        public MyViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyViewPager(Context context) {
            super(context);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            if (isPagingEnabled) {
                return super.onInterceptTouchEvent(event);
            }
            return false;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (isPagingEnabled) {
                return super.onTouchEvent(event);
            }
            return false;
        }
    
        public void setPagingEnabled(boolean pagingEnabled) {
            isPagingEnabled = pagingEnabled;
        }
    }
    
    public class MyViewPager extends ViewPager {
    
    public MyViewPager(Context context,
                           AttributeSet attrs) {
        super(context, attrs);
    }
    
    public MyViewPager(Context context) {
        super(context);
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (canScrollHorizontally(1)||canScrollHorizontally(-1)) {
            return super.onInterceptTouchEvent(event);
        }
    
        return false;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (canScrollHorizontally(1)||canScrollHorizontally(-1)) {
            return super.onTouchEvent(event);
        }
    
        return false;
    }
    
  • 在布局xml中,将com.android.support.v4.ViewPager元素替换为com.yourpackage.MyViewPager元素

  • 由于从寻呼机适配器中的getPageWidth()返回0.3f,因此在向其中添加第四项时,您可能希望启用滚动。棘手的部分是,当您定义寻呼机适配器,并从适配器支持列表中添加或删除任何对象时,到处都有这行代码

    mPager.setPagingEnabled(items.size() > 3);
    

  • Rahuls解决方案可以工作,但如果您希望根据内容自动启用分页,可以修改ViewPager,如下所示:

    public class MyViewPager extends ViewPager {
    
        private boolean isPagingEnabled = false;
    
        public MyViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyViewPager(Context context) {
            super(context);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            if (isPagingEnabled) {
                return super.onInterceptTouchEvent(event);
            }
            return false;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (isPagingEnabled) {
                return super.onTouchEvent(event);
            }
            return false;
        }
    
        public void setPagingEnabled(boolean pagingEnabled) {
            isPagingEnabled = pagingEnabled;
        }
    }
    
    public class MyViewPager extends ViewPager {
    
    public MyViewPager(Context context,
                           AttributeSet attrs) {
        super(context, attrs);
    }
    
    public MyViewPager(Context context) {
        super(context);
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (canScrollHorizontally(1)||canScrollHorizontally(-1)) {
            return super.onInterceptTouchEvent(event);
        }
    
        return false;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (canScrollHorizontally(1)||canScrollHorizontally(-1)) {
            return super.onTouchEvent(event);
        }
    
        return false;
    }
    
    }


    现在,如果ViewPager是可滚动的,它将允许触摸,否则将禁用。

    我可以用这种方法解决这个问题,在getPageWidth()方法中,如果只有一个图像[您可以通过检查数组或arraylist的大小来了解]返回1,如果输入大小大于1,则返回小数。 下面是实现这一点的代码

    @override
    public float getPageWidth(int position){
      if(inpputsize==1){ 
          return 1.0;
      }
      return 0.9;  
    }