2

で構成の変更から回復するのに本当に苦労していますViewPager

私が望むのは、現在のページャーの位置を保存して、構成の変更後に同じページが表示されるようにすることです。そのために、 を使用して保存pager.getCurrentItem()および復元しpager.setCurrentItemます。これは機能しません。setCurrentItem実際には、そのページを選択するのではなく、再作成しようとします! そして、それはページがすでに作成されているにもかかわらずです。

setCurrentItemそれを支えているアダプターを実装するときに何かを見逃したかどうかはわかりませんが、ViewPager完全に構築されていると思われる落とし穴はありますか? ただし、その関数のコードを見ると、意味がありません。アイテムがまったくない場合を除いて、常にページを再作成しようとするようです:

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
    // these are the only checked that make this method return
    if (mAdapter == null || mAdapter.getCount() <= 0) {
        setScrollingCacheEnabled(false);
        return;
    }
    if (!always && mCurItem == item && mItems.size() != 0) {
        setScrollingCacheEnabled(false);
        return;
    }

    // ... removed some init code

    mCurItem = item;
    populate();

    // ...
}

ご覧のとおりpopulate()、アイテムがまったくない場合、または選択しようとしているアイテムが既に選択されている場合を除いて、 は常に呼び出されます。何を与える?それは私には意味がありません。

4

1 に答える 1

3

setCurrentItem は、そのページを選択するのではなく、実際にそのページを再作成しようとします! そして、それはページがすでに作成されているにもかかわらずです。

少なくともコードの読み方に関しては、正確ではありません。

ご覧のとおり、項目がまったくない場合、または選択しようとしている項目が既に選択されている場合を除いて、常に populate() が呼び出されます。

populate()を呼び出します。addNewItem()これは を呼び出しinstantiateItem()ますPagerAdapter。のFragmentPagerAdapter実装でPagerAdapterは、利用可能な場合は既存のフラグメントが使用されます。それ以外の場合は が呼び出されるgetItem()ため、自分でページを作成します。setRetainInstance(true)そのため、ページ フラグメントでを使用していて、 を使用している場合はFragmentPagerAdapter、それらを再利用する必要があります。

FragmentStatePagerAdapterより複雑に思えます。また、独自のPagerAdaptersans フラグメントをローリングする場合は、キャッシング メカニズムを実装する必要があります。

于 2012-06-20T16:06:17.280 に答える