FragmentStatePagerAdapter не работает с большим количеством фрагментов - PullRequest
0 голосов
/ 13 ноября 2018

Моя проблема
Я разрабатываю небольшое приложение для тестирования ViewPager с FragmentStatePagerAdapter. Приложение отображает TextView. Содержимое TextView изменяется для каждой страницы ViewPager. Если я установлю максимальное количество страниц на маленькое число, оно будет работать нормально. Но мне нужна страница на каждый день с начала эпохи. Когда я устанавливаю getCount() на getDaysSinceEpoche(), приложение перестает работать правильно. Изменение страницы занимает до минуты.

Мой вопрос
Что вызывает эту проблему?
Может быть, FragmentStatePagerAdapter не удаляет неиспользуемые фрагменты?

Редактировать
Метод getCount () вызывается 16 раз для каждого пролистывания. Почему это происходит?

Адаптер класса

public class CustomViewPagerAdapter extends FragmentStatePagerAdapter{


public CustomViewPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int i) {
    return FirstFragment.newInstance(i, "xyz");
}

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

public int getDaysSinceEpoch() {

    Calendar now = Calendar.getInstance();
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(0); // start at EPOCH

    int days = 0;
    while (cal.getTimeInMillis() < now.getTimeInMillis()) {
        days += 1;
        cal.add(Calendar.DAY_OF_MONTH, 1); // increment one day at a time
    }
    return days;
}

Фрагмент класса

public class FirstFragment extends android.support.v4.app.Fragment {

private String title;
private int page;

public static FirstFragment newInstance(int page, String title){
    FirstFragment firstFragment = new FirstFragment();
    Bundle args = new Bundle();
    args.putInt("int", page);
    args.putString("string", title);
    firstFragment.setArguments(args);
    return firstFragment;
}

//Store instance variables based oj the arguments passed

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    page = getArguments().getInt("int", 0);
    title = getArguments().getString("string" );
}

//Inflate the View for the fragment based on xml layout

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment, container, false);
    TextView tv = (TextView) view.findViewById(R.id.tv);
    tv.setText(page + " -- " + title);
    return view;
}
...