平滑滚动在 ViewPager 中不起作用(支持库)



我正在编写使用ViewPager来托管Fragment的应用程序。

当我以编程方式更改片段时,平滑滚动功能不起作用。我使用 ViewPager.setCurrentItem(int item, boolean smoothScroll)' 方法。

也许有人知道此错误的解决方法?也许有动画?

编辑:我正在使用支持包。问题是,无论我使用ViewPager.setCurrentItem(2, true)还是ViewPager.setCurrentItem(2, false)结果都是一样的。视图切换非常快(不流畅)。

我已经通过创建一个MyViewPager来解决这个问题,该页面使用反射覆盖ViewPager.mscroller。

public class MyViewPager extends ViewPager 
{
  public MyViewPager( Context context, AttributeSet attrs) 
  {
    super( context, attrs );
    setMyScroller();
  }
  private void setMyScroller() 
  {
    try 
    {
            Class<?> viewpager = ViewPager.class;
            Field scroller = viewpager.getDeclaredField("mScroller");
            scroller.setAccessible(true);
            scroller.set(this, new MyScroller(getContext()));
    } catch (Exception e) 
    {
        e.printStackTrace();
    }
  }
  public class MyScroller extends Scroller 
  {
    public MyScroller(Context context) 
    {
        super(context, new DecelerateInterpolator());
    }
    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) 
    {
        super.startScroll(startX, startY, dx, dy, 1000 /*1 secs*/);
    }
  }
} 

对我有用的是在mPagerAdapter.notifyDataSetChanged()之后调用mPager.setCurrentItem,而不是作为已发布的可运行对象。

下面是一个例子(在MonoDroid中):

    public void UpdateDetialsView(string type)
    {
        string typeName4 = Java.Lang.Class.FromType(typeof(ParcelRecordComplaintDetailsView)).Name;
        if (_fragments.Count > 3)
        {
            _fragments.RemoveAt(_fragments.Count - 1);
            ////////////////////////////////////////////////////////////
            // Called here it wasn't working for me (Posted or not)
            //_viewPager.Post(new Action(() => { _viewPager.SetCurrentItem(3, true); }));
        }
        _fragments.Add(Fragment.Instantiate(Activity, typeName4));
        _pagerAdapter.NotifyDataSetChanged();
        ////////////////////////////////////////////////////////////
        // Called here it works as expected
        _viewPager.SetCurrentItem(3, true);
    }

哪里

    protected MyAdapter _pagerAdapter;
    protected ViewPager _viewPager;
    private List<Android.App.Fragment> _fragments;

    public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter
    {
        private List<Fragment> _fragments;
        public override Java.Lang.Object InstantiateItem(View p0, int p1)
        {
            return base.InstantiateItem(p0, p1);
        }
        public MyAdapter(Android.App.FragmentManager fm) : base(fm)
        {
        }
        public MyAdapter(Android.App.FragmentManager fm, List<Android.App.Fragment> fragments) : base(fm)
        {
            _fragments = fragments;
        }
        public override int Count
        {
            //get { return FRAG_PAGES; }
            get { return _fragments.Count; }
        }
        public override Android.App.Fragment GetItem(int p0)
        {
            return _fragments[p0];
        }
        public override float GetPageWidth(int p0)
        {
            //return base.GetPageWidth(p0);
            return (float) (0.5f);
        }
        public override int GetItemPosition(Java.Lang.Object p0)
        {
            //return base.GetItemPosition(p0);
            return PagerAdapter.PositionNone;
        }
    }

最新更新