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

时间:2013-08-27 09:59:40

标签: android android-viewpager android-pageradapter

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

http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html

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

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

任何想法?

3 个答案:

答案 0 :(得分:11)

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

  1. 在覆盖onInterceptTouchEvent&扩展ViewPager上如果你设置了标志,onTouchEvent只能调用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;
        }
    }
    
  2. 在你的布局xml中,用com.yourpackage.MyViewPager元素替换你的com.android.support.v4.ViewPager元素。

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

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

答案 1 :(得分:10)

Rahuls解决方案有效,但如果您希望根据内容自动启用分页,则可以像这样修改ViewPager:

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是可滚动的,它将允许触摸,否则禁用。

答案 2 :(得分:1)

我能够以这种方式解决它,在你的getPageWidth()方法中,如果只有一个图像[你可以通过检查数组或arraylist的大小来了解]返回1,如果输入大小大于1返回你的小数。 这是实现此目的的代码。

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