2012-08-17 19 views
9

FragmentをホストするのにViewPagerを使用するアプリケーションを作成しています。ViewPager(スムーズスクロール)がViewPager(サポートライブラリ)で機能しない

フラグメントをプログラムで変更するとスムーズなスクロール機能が動作しません。 ViewPager.setCurrentItem(int item、boolean smoothScroll) `メソッドを使用します。

誰かがこのバグの回避策を知っていることがありますか?たぶんアニメーションで?

編集: 私はサポートパッケージを使用しています。問題は、ViewPager.setCurrentItem(2, true)ViewPager.setCurrentItem(2, false)のどちらを使用しても結果は同じです。ビューは本当に速く切り替わります(滑らかではありません)。

+0

最初に、ビューページはサポートパッケージにのみ存在します。問題はあなたが直面している問題は何でしょうか? setCurrentItem(2、false)を実行すると、代わりに何が行われますか?少し具体的に質問を編集できますか? –

+0

だから私はmPager.setCurrentItem(1、真)を置く。オブジェクトがビューページャーであるというヒントをユーザーに与えるためのポストランナブル(postrunnable)内にある。問題は、ポイントを殺すポストランナブルにアニメーションを入れてもアニメーションがないことです。私はこれを行うことができる別の方法はありますか? – MinceMan

答えて

-1

私にとっては、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; 
     } 
    } 
+0

興味深い。あなたは断片を変えています、それは正しいのですか?私はそれらの間を切り替えるだけで断片自体を変えない。私はこのNotifyDataSetChanged()アイデアを試してみます。ありがとう! – Tautvydas

+0

はい、動的に変更しています。私はフラグメントとして実装され、ViewPager内でホストされる4つの半画面パネルを持っています。各パネルは、パネルからその左側にある項目の詳細を表示します(なぜ、それらを動的に更新しているのですか)。私はNotifyDataSetChangedは、実際に何かをあらかじめ変更せずに呼び出すと何かを傷つけるはずはないと思いますが、もしそれが助けになるかどうかわかりません(もしそうでなければ、断片的に何かを変えることができますそれを強制的に呼び出すためにNotifyDataSetChangedを呼び出します)。 – samosaris

17

IはViewPagerをオーバーライドMyViewPagerを作成することによって、これを修正しました。反射を使用しています。

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

+0

ViewPagerのバグ(IMO) –

+5

に対処することに同意します。この回避策とProGuardを使用する場合は、ProGuardの設定にこれを追加する必要があります。 '-keepclassmembers class android.support.v4.view。 ViewPager { \t private android.widget.Scroller mScroller; } ' – Iftah

関連する問題