Android Как правильно реализовать PagerAdapter

80
27 декабря 2020, 09:50

Делаю приложение - расписание. Использую MVP + Moxy

Необходимо сделать фрагмент с выбором параметров расписания

Расписание бывает 3 видов: на неделю, на семестр, на определенную дату. У всех них имеется общее: выбор группы студентов

Я решил сделать фрагмент, где находится spinner с выбором группы.

Выбор параметров, зависящих от типа расписания, решил размещать в ViewPager.

Вопрос: Мне нужно отдельно создавать View, Presenter к каждому типу расписанию, находящихся в ViewPager. Если нет и можно все это реализовать в одном View и Presenter, то как мне получить доступ к элементам, находившихся в ViewPager?

Текущий скриншот:

Главный Фрагмент:

public class SearchScheduleStudentFragment extends PresenterFragment implements SwipeRefreshLayout.OnRefreshListener, SearchScheduleStudentView {
    private SwipeRefreshLayout mSwipeRefreshLayout;
    private SearchScheduleStudentsPagerAdapter mSearchScheduleStudentsPagerAdapter;
    private ViewPager mViewPager;
    private AppCompatSpinner mSpinner;
    ArrayAdapter<String> adapter;
    @InjectPresenter
    SearchScheduleStudentPresenter mPresenter;
    @ProvidePresenter
    SearchScheduleStudentPresenter providePresenter() {
        return new SearchScheduleStudentPresenter(this);
    }

    @Override
    protected SearchScheduleStudentPresenter getPresenter() {
        return mPresenter;
    }
    public static SearchScheduleStudentFragment newInstance() {
        return new SearchScheduleStudentFragment();
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fr_search_schedule_students, container, false);
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        mSwipeRefreshLayout = view.findViewById(R.id.refresher);
        mViewPager = view.findViewById(R.id.search_student_schedule_pager);
        mSpinner = view.findViewById(R.id.spinner_student_groups);
        mSpinner.setAdapter(adapter);
        mSearchScheduleStudentsPagerAdapter = new SearchScheduleStudentsPagerAdapter(getChildFragmentManager());
        mViewPager.setAdapter(mSearchScheduleStudentsPagerAdapter);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mPresenter.getGroups();
        mSwipeRefreshLayout.setOnRefreshListener(this);
    }


    @Override
    public void showLoading() {
    }
    @Override
    public void hideLoading() {
        mSwipeRefreshLayout.setRefreshing(false);
    }
    @Override
    public void showError() {
    }
    @Override
    public void onRefresh() {
    }
    @Override
    public void onDetach() {
        mPresenter = null;
        super.onDetach();
    }
    @Override
    public void showSemesters(List<Semester> semesters) {
    }
    @Override
    public void showGroups(List<GroupStudents> groupsStudents) {
        List<String> groupsName = new ArrayList<>();
        for (GroupStudents groupStudents : groupsStudents) {
            groupsName.add(groupStudents.getName());
            Log.d("Группа", groupStudents.getName());
        }
        adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, groupsName);
        mSpinner.setAdapter(adapter);
    }
}

Его View и Presenter

@InjectViewState
public class SearchScheduleStudentPresenter extends BasePresenter<SearchScheduleStudentView> {
    private SearchScheduleStudentView mView;
    public SearchScheduleStudentPresenter(SearchScheduleStudentView view) {
        mView = view;
    }
    public void getSemesters(){
        mCompositeDisposable.add(
                ApiUtils.getApi()
                .getSemesters()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        response -> mView.showSemesters(response)
                )
        );

    }
    public void getGroups(){
        mCompositeDisposable.add(
                ApiUtils.getApi()
                .getGroups()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        response -> mView.showGroups(response)
                )
        );
    }

    //Относится не к главному, а к pagerAdapter
    public void getWeeks(){
        mCompositeDisposable.add(
                ApiUtils.getApi()
                        .getWeeks()
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(
                                response -> mView.showWeeks(response)
                        )
        );
    }
}

public interface SearchScheduleStudentView extends BaseView {
    void showSemesters(List<Semester> semesters);
    void showGroups(List<GroupStudents> groupStudents);
    void showWeeks(List<Week> weeks);
}

PagerAdapter

public class SearchScheduleStudentsPagerAdapter extends FragmentPagerAdapter {
    private static int COUNT_FRAGMENT = 2;
    public SearchScheduleStudentsPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return SearchScheduleWeekStudentsFragment.newInstance();
            case 1:
                return SearchScheduleDayStudentsFragment.newInstance();
            default:
                return null;
        }
    }
    @Override
    public int getCount() {
        return COUNT_FRAGMENT;
    }
    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        switch (position){
            case 0:
                return "На неделю";
            case 1:
                return "На дату";
            default:
                return null;
        }
    }
}
READ ALSO
Как протестировать Spring веб-метод?

Как протестировать Spring веб-метод?

В этом методе происходит реверс слова с использованием рекурсии и без неё

105
Программа заходит в обе ветви if

Программа заходит в обе ветви if

Учу реактЕсть 2 файла (см

104
Резрешить путь к файлу без кавычек - Webpack

Резрешить путь к файлу без кавычек - Webpack

При сборке проекта (Vue-cli 3), ругается Webpack

102