17

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

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

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

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

有任何想法吗?

4

3 回答 3

12

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

  1. 在覆盖 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;
        }
    }
    
  2. 在您的布局 xml 中,将您的 com.android.support.v4.ViewPager 元素替换为 com.yourpackage.MyViewPager 元素。

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

    mPager.setPagingEnabled(items.size() > 3);
    
于 2013-09-23T07:13:36.003 回答
12

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

于 2015-06-05T10:54:05.757 回答
1

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

@override
public float getPageWidth(int position){
  if(inpputsize==1){ 
      return 1.0;
  }
  return 0.9;  
}
于 2015-06-16T04:44:15.863 回答