В активити есть виджет ViewPager, у viewpager'a есть адаптер FragmentPagerAdapter, который принимает список из 4 одинаковых фрагментов, но с разными аргументами.
Проблема в том, когда запускается приложение, создаётся только 2 первых из списка фрагмента. Остальные создаются только после "листания" экрана активити.
Код активити:
public class TaskListPagerActivity extends BaseActivity {
private ViewPager mViewPager;
private TaskListPagerAdapter mViewPagerAdapter;
public List<TaskListFragment> mTaskListFragments;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_task_list_pager);
mTaskListFragments = createListFragments();
mViewPager = findViewById(R.id.view_pager);
mViewPagerAdapter = new TaskListPagerAdapter(this, getSupportFragmentManager(), mTaskListFragments);
mViewPager.setAdapter(mViewPagerAdapter);
}
private List<TaskListFragment> createListFragments() {
List<TaskListFragment> fragments = new ArrayList<>();
// Фрагменту передаём число, чтобы потом вывести в логе у метода onCreate фрагмента
fragments.add(TaskListFragment.newInstance(-1));
fragments.add(TaskListFragment.newInstance(0));
fragments.add(TaskListFragment.newInstance(1));
fragments.add(TaskListFragment.newInstance(2));
return fragments;
}
}
Код фрагмента:
public class TaskListFragment extends BaseFragment {
public static final String ARGS_PRIORITY_ID = "args_priority_id";
public static TaskListFragment newInstance(int taskPriorityId) {
Bundle args = new Bundle();
args.putInt(ARGS_PRIORITY_ID, taskPriorityId);
TaskListFragment fragment = new TaskListFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int taskPriorityId = getArguments().getInt(ARGS_PRIORITY_ID);
Log.d("MY_TEST", String.valueOf(taskPriorityId));
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_task_list, container, false);
return view;
}
}
Адаптер ViewPager'a:
public class TaskListPagerAdapter extends FragmentPagerAdapter {
private Context mContext;
private List<TaskListFragment> mFragmentsList;
public TaskListPagerAdapter(Context context, FragmentManager fm, List<TaskListFragment> fragmentsList) {
super(fm);
mFragmentsList = fragmentsList;
mContext = context;
}
@Override
public Fragment getItem(int position) {
return mFragmentsList.get(position);
}
@Override
public int getCount() {
return mFragmentsList.size();
}
}
После запуске приложения в лог выводится:
2019-12-15 19:34:25.681 3950-3950/com.example.teamtasks D/MY_TEST: -1
2019-12-15 19:34:25.682 3950-3950/com.example.teamtasks D/MY_TEST: 0
Куда пропали другие фрагменты с аргументами 1 и 2?
Представьте, что у вас во ViewPager - 10 000 фрагментов. Этак у вас памяти не хватит и приложение при запуске упадёт. А вот если отрисовывать фрагменты по мере надобности - то всё будет гораздо лучше. Т.е. это стандарт - отрисовывать только по одному фрагменту с каждой стороны от выбранного. За количество отрисовываемых фрагментов отвечает свойство offscreenPageLimit
- через него можно изменить количество отрисовываемых фрагментов.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Я пытаюсь запустить проект maven в среде intelij idea comunity 2019Данный проект является веб-приложением которое использует фреймворк spring
Распространенная задача, получение данныхНапример, получаю данные о профиле с сервера
есть поля которое может принимать четырехзначные числа если он 25 добавить два нуля перед числом если 9 то три нуля а если 123 то 1 нол как сделать