ViewPager загружает не все фрагменты

176
31 декабря 2021, 00:40

В активити есть виджет 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?

Answer 1

Представьте, что у вас во ViewPager - 10 000 фрагментов. Этак у вас памяти не хватит и приложение при запуске упадёт. А вот если отрисовывать фрагменты по мере надобности - то всё будет гораздо лучше. Т.е. это стандарт - отрисовывать только по одному фрагменту с каждой стороны от выбранного. За количество отрисовываемых фрагментов отвечает свойство offscreenPageLimit - через него можно изменить количество отрисовываемых фрагментов.

READ ALSO
No JDK specified

No JDK specified

Я пытаюсь запустить проект maven в среде intelij idea comunity 2019Данный проект является веб-приложением которое использует фреймворк spring

236
Работа с паттерном Repository

Работа с паттерном Repository

Распространенная задача, получение данныхНапример, получаю данные о профиле с сервера

163
Не работает repaint в JPanel

Не работает repaint в JPanel

Всем приветПроблема такова

145
как в sql добавить нули перед числом

как в sql добавить нули перед числом

есть поля которое может принимать четырехзначные числа если он 25 добавить два нуля перед числом если 9 то три нуля а если 123 то 1 нол как сделать

115