Делаю приложение - расписание. Использую 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;
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В этом методе происходит реверс слова с использованием рекурсии и без неё