8

私は私ができることを知っています

 viewPager.setCurrentItem(position) 

ビューページャーを目的の位置に設定します。私の質問は、アダプターがインスタンス化される前にこれを行うことができるかどうか、およびその方法です。

つまり、私がそうするなら

pagerAdapter = new ViewPagerAdapter(arg1,arg2....);
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(position);

アイテム 0 が最初にビルドされ、その後、目的の位置にあるアイテムもビルドされます。これには2倍の時間がかかります...私のアダプターでは、各アイテムをビルドするのにかなりの作業が必要なので、可能であれば0位置のアイテムをビルドしないようにするのが最善です. おそらく、アダプターのインスタンス化で目的の位置を引数として渡すことで...?

それを行う方法はありますか?

4

6 に答える 6

3

空白のアダプターを設定するだけで、実際のアダプターをこのように設定すると、ビューページャーを「だまして」、不要なデータをロードすることができます。

this.viewPager.setAdapter(new PagerAdapter() {
        @Override
        public int getCount() {
            return 0;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return false;
        }
    });
this.viewPager.setCurrentItem(imagePosition, false);
this.viewPager.setAdapter(adapter);
this.viewPager.setCurrentItem(imagePosition, false);
于 2016-02-11T16:58:34.790 に答える
3

古いバージョンだけでなく Android M でも機能するソリューションの場合は、次のようにリフレクションを使用します。

int currentItem = 5;

// Set initial position first...
Field field = ViewPager.class.getDeclaredField("mRestoredCurItem");
field.setAccessible(true);
field.set(mPager, currentItem);

// ...and then set adapter
mPager.setAdapter(adapter);

ViewPager実装を制御するため (アプリに含まれています) 、リフレクションの使用は安全です。

Proguard を使用する場合は、構成に以下を含める必要があります。

-keepclassmembers class android.support.v4.view.ViewPager {
    private int mRestoredCurItem;
}  

または、mRestoredCurItemProguard によってフィールドの名前が変更されます。

于 2015-09-03T23:06:57.213 に答える
3

時間と作業が気になる場合は、目的のページが作成されるまで、ページを 0 の位置に作成しないようにします。変数を使用して、アダプターで「desiredPageHasBeenBuilt」と言うことができます。位置 0 のアイテムを要求するときに、変数 desiredPageHasBeenBuilt が false の場合は「空のページ」を返すことができます。目的のページがビルドされている場合は、変数を true に設定し、ページ 0 を作成できます。

于 2014-09-25T23:33:09.560 に答える
1

次のように onRestoreInstanceState を呼び出すことで、アダプターが設定される前にビューページャーを騙して特定の位置から開始することができます。

int currentItem = 5;

Parcel parcel = Parcel.obtain();
writeParcelable(BaseSavedState.EMPTY_STATE, 0);

writeInt(currentItem);
writeParcelable(null, 0);

setDataPosition(0);
SavedState savedState = ViewPager.SavedState.CREATOR.createFromParcel(parcel);

mPager.onRestoreInstanceState(savedState);

mPager.setAdapter(mAdapter);
于 2015-07-07T12:46:51.017 に答える