FragmentStatePagerAdapter с одним фрагментом

У меня есть FragmentStatePagerAdapter, где я хочу отображать один и тот же фрагмент несколько раз. Поскольку этот фрагмент состоит из множества представлений, я ищу способ не создавать этот фрагмент каждый раз, когда происходит свипирование пользователя. Я просто хочу перезагрузить данные, Чего я пытаюсь добиться, так это отображать данные за день из моей БД. Проблема в коде моего адаптера

public class MainViewPagerAdapter extends FragmentStatePagerAdapter {

    private String[] titles;

    private int currentPossition;

    public MainViewPagerAdapter(final FragmentManager fragManager, final String[] titles) {
        super(fragManager);
        this.titles = titles;
    }
    private static final int MAX_ITEMS = 400;
    @Override
    public Fragment getItem(final int position) {
        Calendar cal = Calendar.getInstance();

        cal.setTimeInMillis(System.currentTimeMillis());
        if (position < 200) {
            cal.add(Calendar.DAY_OF_YEAR, -1);
        } else if (position > 200) {
            cal.add(Calendar.DAY_OF_YEAR, 1);
        }
        return HomeFragment.getInstance(cal.getTimeInMillis());
    }

    /** Return the max items */
    @Override
    public int getCount() {
        return MAX_ITEMS;
    }

    @Override
    public CharSequence getPageTitle(final int position) {
        String title = "";
        if (position < currentPossition) {
            title = titles[0];
        } else if (position == currentPossition) {
            title = titles[1];
        } else { // else if (position > currentPossition
            title = titles[2];
        }
        return title;
    }

    /** Set the titles */
    public void setTitles(final String[] titles) {
        this.titles = titles;
    }

    /** Set the current position */
    public void setCurrentPossition(final int currentPossition) {
        this.currentPossition = currentPossition;
    }

    @Override
    public int getItemPosition(Object object) {
        if (object instanceof HomeFragment) {
            ((HomeFragment) object).changeMainScreen(DateManager.INSTANCE.getDateSetted());
        }
        return super.getItemPosition(object);
    }
}

Для полноты вот класс, который вызывает мой адаптер

public class MainScreenHolder extends Fragment {

    private static Resources res;

    private static final int START_POINT = 200;

    public static ViewPager pager;

    private MainViewPagerAdapter adapter;

    private static String[] titles = new String[3];

    private static int currentPosition = START_POINT;

    /** Creates and returns the view hierarchy associated with the fragment. */
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
            final Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.food_tabs_container, container, false);
        pager = (ViewPager) view.findViewById(R.id.pager);
        pager.setId(R.id.pager);

        titles = initTitles(0);
        adapter = new MainViewPagerAdapter(getChildFragmentManager(), titles);
        adapter.setCurrentPossition(START_POINT);
        pager.setAdapter(adapter);
        pager.setCurrentItem(START_POINT);

        pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(final int position) {
                final OnRefreshListener fragment = (OnRefreshListener) adapter.instantiateItem(pager,
                        position);

                adapter.setCurrentPossition(position);
                adapter.setTitles(setTitles(position));

                if (fragment != null) {
                    fragment.onRefresh();
                }
            }

            @Override
            public void onPageScrollStateChanged(final int state) {
                // nothing
            }

            @Override
            public void onPageScrolled(final int position, final float positionOffset,
                    final int positionOffsetPixels) {
                // nothing
            }
        });
        return view;
    }

    /** Called to do initial creation of a fragment */
    @Override
    public void onCreate(final Bundle savedState) {
        super.onCreate(savedState);
        res = getResources();
    }

    private String[] setTitles(final int position) {
        if (currentPosition < position) {
            titles[0] = titles[1];
            titles[1] = titles[2];
            DateManager.INSTANCE.addDays(2);
            titles[2] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
            DateManager.INSTANCE.addDays(-1);
        } else if (currentPosition > position) {
            DateManager.INSTANCE.addDays(-2);
            titles[2] = titles[1];
            titles[1] = titles[0];
            titles[0] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
            DateManager.INSTANCE.addDays(1);
        }
        currentPosition = position;
        return titles;
    }

    /** Set initial value for titles */
    public static String[] initTitles(final int offset) {
        titles[1] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
        DateManager.INSTANCE.addDays(1);
        titles[2] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
        DateManager.INSTANCE.addDays(-2);
        titles[0] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
        DateManager.INSTANCE.addDays(1);
        currentPosition = START_POINT + offset;
        return titles;
    }
}

Примечание: мой код работает, но я хочу улучшить производительность.
Моя стартовая позиция 200, так что пользователь может провести 200 дней назад и 200 дней вперед.
Есть ли способ не создавать новый фрагмент снова и снова, когда происходит свайп.

1 ответ

Я никогда не использовал FragmentStatePagerAdapter, но меня интересует эта проблема. Попробуйте это, переопределите метод instantiateItem() в MainViewPagerAdapter контролировать возвращенный вид или фрагмент, в вашем случае. Образец кода:

@Override
public Object instantiateItem(ViewGroup container, int position) {
   return HomeFragment;
}

Я предполагаю, что объект HomeFragment уже определен, так как я не вижу код для него.

Другие вопросы по тегам