快速滑动时奇怪的视图寻呼机行为

时间:2015-03-16 17:39:54

标签: android android-viewpager

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

我的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版本上测试了这种行为,并且都出现了这个问题。

非常感谢,

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

更新1:

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

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

唯一的区别是,无论有没有CardView,我都会收到相同的错误,所以我不认为问题仅限于卡片视图。

如果有人可以提供帮助,这个问题无法解决,我将不胜感激。

2 个答案:

答案 0 :(得分:4)

经过多个小时的调试后,我发现了ViewPager源代码中的问题。问题是我的片段包含一个也在听触摸事件的视图。当以正常速度滚动时,两者不会相互干扰(在ViewPager中有一个Runnable()我建议查看并了解它与滚动的交互,并了解速度和&# 34;在VP中跳页运行)但是当我滚动事实时,VP onTouch中的可运行和速度的组合对我的观点不会很好。

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

答案 1 :(得分:0)

在你的getItem方法中,你的意思是每次都创建一个新的片段吗?什么是_fragments?而是尝试:

@Override
public Fragment getItem(int position) {
    Fragment fragment = _fragments.get(position);
    if (fragment == null) {
        fragment = createFragmentFromType(content);
        _fragments.put(position, fragment);
        //save your fragment names, or better, create a custom fragment with a getTitle method.
    }

    return fragment;
}

for getCount()方法尝试:

@Override
    public int getCount() {
      return _fragments.size();
}

摆脱了对destroyItem()的覆盖,看起来过于复杂和不必要。