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 уже определен, так как я не вижу код для него.