当前位置: 首页 > 知识库问答 >
问题:

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

束研
2023-03-14

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

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

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

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

有什么想法吗?

共有1个答案

贺懿轩
2023-03-14

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

>

  • 扩展ViewPager on override onInterceptTouchEvent&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;
        }
    }
    

    在布局xml中,用com.yourpackage.myviewpager元素替换com.android.support.v4.viewpager元素。

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

  •  类似资料:
    • 使用sdk第8版和android-support-v4,我试图实现一个一次显示多个页面的PagerAdapter。 在网上找到了一些很好的建议,这表明实现这一目标的最佳方法是覆盖PagerAdapter上的getPageWidth(int)方法。 http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html

    • 在MVVM模式中,ViewModel包含业务逻辑,并在需要更新时通知视图。视图还会通知用户事件。 据我所知,每个模型都应该有一个关联的ViewModel。因此,如果我们有以下模型: 用户 账目 我们将有以下视图模型: UserViewModel 帐户视图模型 然而,我找到的所有关于MVVM数据绑定的示例,都使用一个ViewModel作为布局。最近,谷歌在架构组件中引入了ViewModel类。这让我

    • 我有一个问题与自动滚动在滚动视图。 在我的例子中,有两个Recyclerview。第一个循环视图,水平滚动,第二个垂直滚动。第一个循环视图仅用于拖动,第二个循环视图只用于拖放。两个循环视图都在ScrollView中,所以我在第二个循环视图中禁用了垂直滚动。我在第二个Recyclerview的项目中添加了DragListener。每个项目都有一个拖动侦听器,因此我在拖放项目时添加/替换项目。 所以我

    • 下面是我要做的:我在屏幕底部有一个水平的RecyclerView。当我单击一个项目时,我希望在该特定项目上方显示一个弧形菜单(类似于此http://www.andbrain.com/wp-content/uploads/2015/04/device-2015-04-07-165251.png),该菜单允许一些操作: 由于弧形菜单不能包含在item视图中,所以我使用了item视图管理的PopupWi

    • 在我的应用程序中,我使用了tabHost Activity,在tabHost的第一个选项卡中,我使用了TabActivity,我加载了500多个图像。 使用嵌套滚动视图: 我在RecycerView中使用了嵌套滚动视图。当加载主页时,它最初加载了所有500张图像,然后显示主页。这样会导致内存出错。 我需要滚动放置在RecycerView顶部的相对布局。所以我使用了嵌套滚动视图。但它对我不起作用。

    • 这就是我想要的: 如上图所示,我想在上画一条中心线,然后在滚动时获得中心项(以及向左或向右移动) 以下是我尝试画一个水平的: 有没有办法知道哪个项目移动到了回收视图的中心?如何将向左或向右滚动一个位置? 更新:我尝试使用滚动侦听器来获得中间位置,但它不能作为一个方面。 并得到结果: 我只想在蓝色上更改选中的项目(使文本变为白色)