ImangazalievM
@ImangazalievM
Android-программист

Как вставить необычный фрагмент во ViewPager?

Как вставить необычный фрагмент во ViewPager?

Есть ViewPager с фрагментами. Адаптер берет данные из массива и на основании этого массива создаются фрагменты:
/**
 * Адаптер для ViewPager с шагами
 */
public class StepsAdapter extends FragmentStatePagerAdapter {

    private List<StepsMenuItem> mSteps;

    public StepsAdapter(FragmentManager fm, List<StepsMenuItem> steps) {
        super(fm);
        mSteps = steps;
    }

    @Override
    public Fragment getItem(int position) {
        return StepFragment.newInstance(mSteps.get(position).getFileName());
    }

    /**
     * Возвращает количество шагов
     *
     * @return Количество шагов
     */
    @Override
    public int getCount() {
        return mSteps.size()+1;
    }


}


Представим, что в массиве 10 элементов. Мне нужно показывать на 8 позиции не фрагмент StepFragment, а фрагмент WhatNextFragment, при этом остальные фрагменты должны сместиться. В общем получается 11 элементов. Как можно реализовать это наиболее безболезненно и с наименьшим количеством костылей?
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Можно сделать так:
Некий интерфейс:
interface Item {
    Fragment getFragment()
}

и две его реализации:
class StepItemImpl implements Item {
    private StepsMenuItem data;
    StepItemImpl(StepsMenuItem data) {
        this.data = data;
    }
    @Override
    public Fragment getFragment() {
        return StepFragment.newInstance(data.getFileName());
    }
}

class WhatNextImpl implements Item {
    @Override
    public Fragment getFragment() {
        return WhatNextFragment.newInstance(...);
    }
}


далее, вы оборачиваете в эти класс свои данные и у вас получается список:
List<Item> mItems;
...
    @Override
    public Fragment getItem(int position) {
        return mItems.get(position).getFragment();
    }
...
    @Override
    public int getCount() {
        return mItems.size()+1;
    }
/code>
Как-то так.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
TranE91
@TranE91
Senior Android Engineer
Можно сделать свой аналог getItemType(int position) как в классическом адаптере от ListView
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы