30

ViewPagerの通常の動作とそのオフスクリーン ページ制限をバイパスする方法はありますか? MyViewPagerには 4 つの が含まれfragments、それぞれgridviewに の画像が含まれています。私が抱えている問題は、 のインスタンス化でViewPager2 つfragmentsが作成され、その結果、約 20 個の画像 (フラグメントごとに約 10 個) が同時に catch からダウンロード/フェッチされることです。オフスクリーン ページ制限を無効にすることはできますか?

私の目標は、fragmentが選択されている場合、またはユーザーが画像をホバリングしている場合にのみ、画像をダウンロードすることです。これを実現する 1 つの方法は、onPageSelectedリスナーを使用してフラグを設定することです。このフラグはGridViewAdapter、イメージのダウンロードを許可するかどうかを に通知します。

私が考えることができる 2 番目の方法は、 に を設定し、HoverListenerImageViewイメージのみをダウンロードすることonHoverですが、そのリスナーは 4.0 以降でのみ使用できます。

これを達成するためのより良い方法はありますか?

4

7 に答える 7

46

オフスクリーン ページ制限を無効にすることはできますか?

いいえ。すでに最小値に設定されています。つまり、表示されたページの両側に 1 ページずつです。これは、アニメーション効果を機能させるために必要です。2 つのフラグメント (元のフラグメントと新しいフラグメント) の一部が同時に表示されます。

私の目標は、フラグメントが選択されたとき、またはユーザーが画像をホバリングしているときにのみ画像をダウンロードすることです。

次に、グリッドにプレースホルダー画像をロードし、ページが変更されるまで実際の画像をロードしないでください。

また、「ホバー」とは、ほとんどの Android デバイスでは使用されない、ある種のマウスまたは同様のポインターを意味することに注意してください。

于 2012-07-25T13:16:33.330 に答える
34

オフスクリーン制限を 1 に設定するだけです。

ViewPager mViewpager = (ViewPager)findView....
mViewPager.setOffscreenPageLimit(1);
于 2012-07-25T12:58:30.273 に答える
5

私の目標は、フラグメントが選択されたときにのみ画像をダウンロードすることです

setUserVisibleHint(boolean isVisibleToUser)ViewPager で Fragment のコールバックを使用できます。

于 2016-05-18T09:36:21.760 に答える
2

扱うviewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()

その中で、使用position + 1前後に余分なビューを削除します(つまり、ページャーに読み込まれるページを現在、前、次の 3 つだけに制限します。position - 1viewPager.removeViewAt(int)

次に、破棄されたビューのビットマップを ingdestroyItemして、viewpager アダプターで処理する必要があります。recycle()

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    LinearLayout layout = (LinearLayout) object;
    ((ViewPager) container).removeView(layout);
    ImageView imgDisplay = (ImageView) layout.findViewById(R.id.quranPage);
    Drawable drawable = imgDisplay.getDrawable();
    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        Bitmap bitmap = bitmapDrawable.getBitmap();
        if (bitmap != null) //when reading page fails, this will be null
            bitmap.recycle();
    }
}
于 2015-11-01T03:20:01.700 に答える
2

Android Data Binding を使用して xml でこれを行うこともできます。

<android.support.v4.view.ViewPager
    [...]
    app:offscreenPageLimit="@{1}"
    [...]
</android.support.v4.view.ViewPager>
于 2016-11-16T07:43:45.343 に答える