草庐IT

android - 快速滑动时奇怪的 View 寻呼机行为

coder 2023-12-22 原文

我似乎遇到了一个奇怪的问题。

当我“缓慢”滑动时,我的 ViewPager 工作得非常好(例如,我的滑动之间有间隙 - 甚至半秒)但是如果我滑动得足够快(每秒 2-3 页),之后3-4 页,我观察到以下行为之一:

  • 有时好像要跳回几页
  • 或者再次显示相同的页面
  • 或者显示一个白色页面(我想那是一个空白页面,因为我的背景是白色的)
  • 或将自己固定在两个页面之间(显示每个页面的一半)。

这是我的适配器:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

    private SparseArray<String> _fragmentHeaders = new SparseArray<String>();
    private SparseArray<Fragment> _fragments = new SparseArray<Fragment>();
    private Integer _previousCount = null;
    private boolean _isDatasetBeingChanged;

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);

        registerDataSetObserver(new DataSetObserver() {
            @Override
            public void onChanged() {
                _previousCount = getContentCount();
                super.onChanged();
            }
        });
    }

    public Fragment getExistingItem(int position) {

        Fragment fragment = _fragments.get(position, null);
        if (fragment != null) {
            return fragment;
        }

        return null;
    }

    @Override
    public Fragment getItem(int position) {
        TType content = findContentWithPosition(position);
        if (_fragmentHeaders.get(position, null) == null) {
            _fragmentHeaders.put(position, content.getTitle());
        }

        Fragment fragment = createFragmentFromType(content);
        _fragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        RoboFragment fragment = (RoboFragment) object;
        if (fragment != null) {
            fragment.onDestroy();
        }

        if (_fragmentHeaders.get(position, null) != null) {
            _fragmentHeaders.remove(position);
        }

        if (_fragments.get(position, null) != null) {
            _fragments.remove(position);
        }

        super.destroyItem(container, position, object);
    }

    @Override
    public int getCount() {
        int count = getContentCount();
        if (_isDatasetBeingChanged) {
            return count;
        }

        if (_previousCount != null && _previousCount != count) {
            _isDatasetBeingChanged = true;
            notifyDataSetChanged();
        }

        _previousCount = count;
        _isDatasetBeingChanged = false;
        return _previousCount;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return _fragmentHeaders.get(position);
    }
}

正如我提到的,如果我慢慢滑动,它就会起作用。我只是像这样添加适配器:

_sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
_viewPager.setAdapter(_sectionsPagerAdapter);

有没有人见过这个?我正在使用支持库的第 22 版,并且就 SDK 而言,一切都是最新的。

我已经在 5.0 和 4.4 版本上测试了这个行为,并且都出现了这个问题。

非常感谢,

附注问题不在于调用 notifyDataSetChanged()。删除它没有任何影响,即使基础页数没有改变也会发生这种情况。

更新 1:

我发现这个 Google 页面似乎描述了我在这里提到的问题:

http://code.google.com/p/android-developer-preview/issues/detail?id=1190

唯一的区别是,无论有没有 CardView,我都会得到同样的错误,所以我认为问题不限于卡片 View 。

虽然没有解决此问题,但如果有人可以提供帮助,我将不胜感激。

最佳答案

在对 ViewPager 的源代码进行了数小时的调试后,我发现了这个问题。问题是我的 fragment 包含一个也在监听触摸事件的 View 。当以正常速度滚动时,两者不会相互干扰(ViewPager 中有一个 Runnable() 我建议查看并了解它与滚动的交互,并了解 VP 中的速度和“页面跳转”操作)但是当我滚动事实时,VP 的 onTouch 中的 runnable 和 velocity 的组合不会在我的 View 中很好地发挥作用。

解决方案是删除正在监听 onTouch 的内部 View 。虽然这是一个极端的措施,并且改变了我的代码和布局的一些相当重要的部分,但我实在太害怕复制整个 VP 的源代码并更改导致问题的部分。

关于android - 快速滑动时奇怪的 View 寻呼机行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29083437/

有关android - 快速滑动时奇怪的 View 寻呼机行为的更多相关文章

  1. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  2. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  3. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  6. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  7. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  8. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  9. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  10. ruby - 使对象的行为类似于 ruby​​ 中并行分配的数组 - 2

    假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje

随机推荐