49

SDK 4.03、Samsung Infuse Android 2.2、Android 4 のサポート ライブラリでコンパイルし、アプリで ViewPager を使用すると、実際のスワイプは正常に動作しますが、実行すると

viewPager.setCurrentItem(id); // , or
viewPager.setCurrentItem(id, true);  

スムーズ スクロールではなく、ビューを瞬時に切り替えます。ドキュメントには、それが 2 番目の引数を true に設定する目的であることが明確に記載されています。これどうしたの?

4

13 に答える 13

43

リフレクションを使用して ViewPager.mScroller をオーバーライドする 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*/);
        }
    }
}
于 2013-03-21T14:07:40.980 に答える
16

これは私がしたことです。同じパッケージに独自のカスタムサブクラスを配置することsmoothScrollToで、package-privateメソッドをオーバーライドしました。ViewPagerゼロの値が渡されていたため、スムーズなスクロールではなくスナップ動作が発生していました。

package android.support.v4.view;

import android.content.Context;
import android.util.AttributeSet;

public class MyViewPager extends ViewPager {

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attr) {
        super(context, attr);
    }

    void smoothScrollTo(int x, int y, int velocity) {
        super.smoothScrollTo(x, y, 1);
    }
}

必要に応じて、実際の速度ISOを1だけ計算して提供できるので、うまく機能しました。

于 2013-02-08T15:45:42.470 に答える
14

setCurrentItemハンドラーで関数を呼び出したところ、問題なく機能しました。

new Handler().post(new Runnable() {
        @Override
        public void run() {
            myViewPager.setCurrentItem(1, true);
        }
    });

お役に立てれば。

于 2015-11-02T09:06:28.183 に答える
0

同じ問題がありましたが、今日は簡単な解決策を見つけました。多分それはあなたを助けるでしょう。まず、画面全体に表示されるViewPagerがあるとします。ページを切り替えるために、タブ付きの独自のカスタムビューを作成し、それをViewPagerの上に置きました。タブをクリックすると、setCurrentItem(item、true)を使用してViewPagerの適切なページにスムーズにスクロールするはずですが、スムーズではなく、瞬時にスクロールします。次に、ViewPager +コールバックに(カスタムではなく)単純なボタンを追加しようとしました。

@Override
public void onClick(View v) {
   viewPager.setCurrentItem(item, true);
}

その後、スムーズなスクロールが機能し始めました。したがって、解決策は非常に単純でした。Buttonクラス内では、内部ブールonTouch(...)リスナーがtrueを返すため、常にタッチイベントを消費します。次に、内部ブールonTouch(...)リスナーで「returnfalse」を「returntrue」に置き換えたときに、カスタムタブビューでスムーズスクロールが機能し始めました。

私のサクセスストーリーがお役に立てば幸いです。

于 2012-08-16T09:06:53.177 に答える
0

Xamarin を使用する場合 (このアプローチは Java にも適用できますが)、上記の回答に基づいて次のアプローチを使用することをお勧めします (Android サポート ライブラリ v7 AppCompat 19.1.0 の ViewPager)。

public void ScrollSmooth(int i)
{
    var jClass = JNIEnv.GetObjectClass(_pager.Handle);
    var jMethod = JNIEnv.GetMethodID(jClass, "setCurrentItemInternal", "(IZZI)V");
    JNIEnv.CallVoidMethod (_pager.Handle, jMethod, new JValue (i), new JValue (true), new JValue (false), new JValue (1));
}

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/support/v4/view/ViewPager.javaの ViewPager 実装に依存しています。

于 2014-07-25T00:57:35.160 に答える
0

一日を無駄にした後、offscreenPageLimitを合計なしに設定したソリューションを見つけました。ページの。

これに従ってください https://stackoverflow.com/a/54800154/9097612

于 2019-02-21T06:02:35.237 に答える
0

ViewPager はリビジョン 5 から 9 に大幅に変更されました。問題に関連している可能性のある変更の一部:

  • ViewPager でのユーザー インターフェイス動作のバグ修正 (リビジョン 5 および 6)
  • ViewPager の多数のバグを修正しました (リビジョン 9)

あなたのコードが問題なく動作することを考えると、サポート ライブラリが最新ではないというのが私の推測です。そうでない場合は、ライブラリを更新してみてください。

于 2012-08-15T00:39:07.553 に答える