【问题标题】:Android ViewPager scrolling issue with only one item when using getPageWidth from PagerAdapter使用 PagerAdapter 中的 getPageWidth 时,Android ViewPager 滚动问题只有一项
【发布时间】:2013-08-27 09:59:40
【问题描述】:
我有一个带有自定义 PagerAdapter 的 ViewPager,它覆盖方法 getPageWidth 以返回 0.3f,因此我可以在屏幕上显示多个页面,如下面的博客中所建议的那样:
http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html
在这种情况下,ViewPager 开始为空,用户开始按请求填充页面(图像)。图像从左到右填充。一切正常,页面是动态创建的,当有多个图像时很容易在它们之间滑动。
但是,当实例化的页面少于三个时,就会出现问题。从右(无内容)向左滑动手势会产生闪烁,页面交替地从左向右移动,就好像 ViewPager 试图将第一页向右移动但后来又转向其原始位置。这发生在整个手势期间,并在离开手势时停止。正如我所说,当页面足以覆盖整个屏幕宽度并且需要真正的滚动时,不会发生这种情况。
有什么想法吗?
【问题讨论】:
标签:
android
android-viewpager
android-pageradapter
【解决方案1】:
我知道这是一个老问题,但我只是在寻找解决方案并遇到了this link(它奇怪地引用了这个问题)。无论如何,我能够根据他们的 cmets 找出解决方案。基本思想是允许基于您设置的布尔标志状态的触摸事件。
-
在覆盖 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;
}
}
在您的布局 xml 中,将您的 com.android.support.v4.ViewPager 元素替换为 com.yourpackage.MyViewPager 元素。
-
由于您在寻呼机适配器中从 getPageWidth() 返回 0.3f,因此您希望在添加第四项时启用滚动。棘手的部分是,当您定义寻呼机适配器并在适配器后备列表中添加或删除任何对象时,这行代码无处不在。
mPager.setPagingEnabled(items.size() > 3);
【解决方案2】:
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 是可滚动的,它将允许触摸,否则禁用。
【解决方案3】:
我能够通过这种方式解决它,在您的 getPageWidth() 方法中,如果只有一个图像[您可以通过检查数组或数组列表的大小来了解] 如果输入大小大于 1,则返回 1返回你的小数。
这是实现此目的的代码。
@override
public float getPageWidth(int position){
if(inpputsize==1){
return 1.0;
}
return 0.9;
}