2012-08-17 67 views
9

我正在编写使用ViewPager来应用主机Fragment的应用程序。平滑滚动在ViewPager中不起作用(支持库)

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

也许任何人都知道解决这个bug?也许动画?编辑: 我正在使用支持包。问题是我是否使用ViewPager.setCurrentItem(2, true)ViewPager.setCurrentItem(2, false)的结果是一样的。视图切换非常快(不平稳)。

+0

首先,在viewpager仅在支持包存在。现在的问题是,你面临的问题是什么?如果你做setCurrentItem(2,false)它做了什么呢?你可以编辑你的问题更具体一点吗? – 2012-08-22 19:22:18

+0

所以我把mPager.setCurrentItem(1,true);在postrunnable中向用户提示该对象是viewpager。问题在于,当我把它放在可杀死重点的postrunnable中时,没有动画。有另外一种方法可以做到这一点吗? – MinceMan 2012-11-25 15:56:34

回答

-1

对我而言,最有效的方式是在mPagerAdapter.notifyDataSetChanged()之后调用mPager.setCurrentItem,而不是作为发布的runnable。

下面是一个例子(在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; 
     } 
    } 
+0

有趣。你正在改变这些碎片,是对的吗?我不会仅仅试图在它们之间切换而改变片段。我会尝试一下这个NotifyDataSetChanged()的想法。谢谢! – Tautvydas 2012-12-03 11:38:42

+0

是的,我正在动态改变它们。我有4个半屏面板,这些面板被实现为碎片并托管在ViewPager中。每个面板显示面板左侧项目的详细信息(这也是我动态更新它们的原因)。我不认为NotifyDataSetChanged应该会伤害任何事情,如果你事先没有改变任何东西,它会调用它,尽管我不确定它是否会有帮助(如果没有,也许你可以改变一些非常小的碎片,改变它)返回,然后调用NotifyDataSetChanged,强制它?)。 – samosaris 2012-12-03 16:37:16

17

我已经通过创建覆盖ViewPager一个MyViewPager固定这一点。 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*/); 
    } 
    } 
} 
+0

这个解决方案是一个令人讨厌的解决方案,但实际上应该工作!谢谢,我会尽力实施你的建议。 – Tautvydas 2013-03-22 14:27:34

+0

我同意这是解决ViewPager错误(IMO) – 2013-03-22 15:01:24

+5

如果您使用此解决方法和ProGuard,则需要将此添加到您的ProGuard配置: '-keepclassmembers class android.support.v4.view。 ViewPager { \t private android.widget.Scroller mScroller; }' – Iftah 2014-02-16 13:43:12