ViewFlipper против фрагментов - PullRequest
9 голосов
/ 25 января 2012

У меня есть действие с ViewFlipper, которое переключается между кучей просмотров (страниц) с моими данными.

Я рассматриваю возможность использования API фрагментов для переключения между моими представлениями. Каковы преимущества этого?

Могу ли я увидеть повышение производительности за счет использования фрагментов, поскольку ViewFlipper по существу переключает флаги видимости, а фрагменты фактически заменяют иерархию представления при добавлении / удалении их?

Может ли кто-нибудь дать нам более глубокое понимание этого вопроса?

Спасибо!

1 Ответ

3 голосов
/ 30 января 2012

РЕДАКТИРОВАТЬ: Я говорю о ViewPager здесь, а не ViewFlipper.

Преимущество использования ViewPager в том, что им очень просто пользоваться. Вы просто создаете FragmentPagerAdapter и заполняете пару простых полей. Ниже приведен пример, который я написал для отображения элементов, переданных из родительского класса.

public static class DashboardPagerAdapter extends FragmentPagerAdapter {

    private static final int NUM_ITEMS_PER_SCREEN = 12;

    private List<View> mAllItems;
    private int mNumScreens;

    public DashboardPagerAdapter(FragmentManager fm, List<View> allItems) {
        super(fm);
        mAllItems = allItems;
        mNumScreens = (int) Math.ceil(mAllItems.size()
                / (float) NUM_ITEMS_PER_SCREEN);
        Log.d(TAG, "num screens: " + mNumScreens);
    }

    @Override
    public int getCount() {
        return mNumScreens;
    }

    @Override
    public Fragment getItem(int position) {
        DashboardScreenFragment screen = DashboardScreenFragment
                .newInstance();

        for (int i = position * NUM_ITEMS_PER_SCREEN; i < (position + 1)
                * NUM_ITEMS_PER_SCREEN; i++) {
            if (i >= mAllItems.size()) {
                break;
            }
            screen.addChild(mAllItems.get(i));
        }
        return screen;
    }
}

И настроить его очень просто:

    final DashboardPagerAdapter adapter = new DashboardPagerAdapter(
            getFragmentManager(), mAllButtons);

Вопреки сказанному @ sebap123, вы можете использовать фрагменты с Android v4 и выше с библиотекой поддержки; подробности смотрите в http://developer.android.com/sdk/compatibility-library.html, но на самом деле это просто помещение файла jar в каталог / libs.

Кстати, обратите внимание, что в ViewPager каждая «страница» сама является фрагментом.

Что касается улучшения производительности, это зависит от того, с чем вы его сравниваете. Я настоятельно рекомендую попробовать ViewPager и только после беспокойства о проблемах производительности. Как сказал Дональд Кнут, «мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всех зол».

В любом случае, если у вас большое количество страниц, см. http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html для более подходящего адаптера.

...