Fix resuming states in fragments (#72)
* Downgrade sdk version * Update dependencies * Fix infinite loading on restore states * Fix crash when loading loaded fragments
This commit is contained in:

committed by
Mikołaj Pich

parent
3dabb11473
commit
8431661d54
@ -17,20 +17,16 @@ public interface AttendanceContract {
|
||||
|
||||
void setAdapterWithTabLayout();
|
||||
|
||||
void setChildFragmentSelected(int position, boolean selected);
|
||||
|
||||
boolean isMenuVisible();
|
||||
}
|
||||
|
||||
@PerActivity
|
||||
interface Presenter extends BaseContract.Presenter<View> {
|
||||
|
||||
void onFragmentVisible(boolean isVisible);
|
||||
|
||||
void onTabSelected(int position);
|
||||
|
||||
void onTabUnselected(int position);
|
||||
void onFragmentActivated(boolean isVisible);
|
||||
|
||||
void onStart(View view, OnFragmentIsReadyListener listener);
|
||||
|
||||
void setRestoredPosition(int position);
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,9 @@ import io.github.wulkanowy.ui.base.BaseFragment;
|
||||
import io.github.wulkanowy.ui.main.OnFragmentIsReadyListener;
|
||||
import io.github.wulkanowy.ui.main.TabsData;
|
||||
|
||||
public class AttendanceFragment extends BaseFragment implements AttendanceContract.View, TabLayout.OnTabSelectedListener {
|
||||
public class AttendanceFragment extends BaseFragment implements AttendanceContract.View {
|
||||
|
||||
private static final String CURRENT_ITEM_KEY = "CurrentItem";
|
||||
|
||||
@BindView(R.id.attendance_fragment_viewpager)
|
||||
ViewPager viewPager;
|
||||
@ -45,6 +47,10 @@ public class AttendanceFragment extends BaseFragment implements AttendanceContra
|
||||
component.inject(this);
|
||||
setButterKnife(ButterKnife.bind(this, view));
|
||||
presenter.onStart(this, (OnFragmentIsReadyListener) getActivity());
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
presenter.setRestoredPosition(savedInstanceState.getInt(CURRENT_ITEM_KEY));
|
||||
}
|
||||
}
|
||||
|
||||
return view;
|
||||
@ -54,25 +60,10 @@ public class AttendanceFragment extends BaseFragment implements AttendanceContra
|
||||
public void setMenuVisibility(boolean menuVisible) {
|
||||
super.setMenuVisibility(menuVisible);
|
||||
if (presenter != null) {
|
||||
presenter.onFragmentVisible(menuVisible);
|
||||
presenter.onFragmentActivated(menuVisible);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabSelected(TabLayout.Tab tab) {
|
||||
presenter.onTabSelected(tab.getPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabUnselected(TabLayout.Tab tab) {
|
||||
presenter.onTabUnselected(tab.getPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabReselected(TabLayout.Tab tab) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTabDataToAdapter(TabsData tabsData) {
|
||||
pagerAdapter.setTabsData(tabsData);
|
||||
@ -81,14 +72,7 @@ public class AttendanceFragment extends BaseFragment implements AttendanceContra
|
||||
@Override
|
||||
public void setAdapterWithTabLayout() {
|
||||
viewPager.setAdapter(pagerAdapter);
|
||||
|
||||
tabLayout.setupWithViewPager(viewPager);
|
||||
tabLayout.addOnTabSelectedListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setChildFragmentSelected(int position, boolean selected) {
|
||||
((AttendanceTabFragment) pagerAdapter.getItem(position)).setSelected(selected);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -109,6 +93,12 @@ public class AttendanceFragment extends BaseFragment implements AttendanceContra
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
outState.putInt(CURRENT_ITEM_KEY, viewPager.getCurrentItem());
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
presenter.onDestroy();
|
||||
|
@ -19,6 +19,7 @@ import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem;
|
||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||
import eu.davidea.viewholders.ExpandableViewHolder;
|
||||
import io.github.wulkanowy.R;
|
||||
import io.github.wulkanowy.data.db.dao.entities.Day;
|
||||
@ -58,12 +59,13 @@ public class AttendanceHeaderItem
|
||||
}
|
||||
|
||||
@Override
|
||||
public HeaderViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
|
||||
public HeaderViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||
return new HeaderViewHolder(view, adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindViewHolder(FlexibleAdapter adapter, HeaderViewHolder holder, int position, List payloads) {
|
||||
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, HeaderViewHolder holder,
|
||||
int position, List<Object> payloads) {
|
||||
holder.onBind(day, getSubItems());
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@ public class AttendancePresenter extends BasePresenter<AttendanceContract.View>
|
||||
|
||||
private OnFragmentIsReadyListener listener;
|
||||
|
||||
private int positionToScroll;
|
||||
private int positionToScroll = 0;
|
||||
|
||||
private boolean isFirstSight = false;
|
||||
|
||||
@ -45,7 +45,10 @@ public class AttendancePresenter extends BasePresenter<AttendanceContract.View>
|
||||
if (dates.isEmpty()) {
|
||||
dates = TimeUtils.getMondaysFromCurrentSchoolYear();
|
||||
}
|
||||
positionToScroll = dates.indexOf(TimeUtils.getDateOfCurrentMonday(true));
|
||||
|
||||
if (positionToScroll == 0) {
|
||||
positionToScroll = dates.indexOf(TimeUtils.getDateOfCurrentMonday(true));
|
||||
}
|
||||
|
||||
if (!isFirstSight) {
|
||||
isFirstSight = true;
|
||||
@ -57,22 +60,12 @@ public class AttendancePresenter extends BasePresenter<AttendanceContract.View>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFragmentVisible(boolean isVisible) {
|
||||
public void onFragmentActivated(boolean isVisible) {
|
||||
if (isVisible) {
|
||||
getView().setActivityTitle();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabSelected(int position) {
|
||||
getView().setChildFragmentSelected(position, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabUnselected(int position) {
|
||||
getView().setChildFragmentSelected(position, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDoInBackgroundLoading() throws Exception {
|
||||
for (String date : dates) {
|
||||
@ -97,6 +90,11 @@ public class AttendancePresenter extends BasePresenter<AttendanceContract.View>
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRestoredPosition(int position) {
|
||||
this.positionToScroll = position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
isFirstSight = false;
|
||||
|
@ -16,6 +16,7 @@ import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||
import eu.davidea.flexibleadapter.items.AbstractSectionableItem;
|
||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||
import io.github.wulkanowy.R;
|
||||
import io.github.wulkanowy.data.db.dao.entities.AttendanceLesson;
|
||||
@ -60,12 +61,13 @@ class AttendanceSubItem
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttendanceSubItem.SubItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
|
||||
return new AttendanceSubItem.SubItemViewHolder(view, adapter);
|
||||
public SubItemViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||
return new SubItemViewHolder(view, adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindViewHolder(FlexibleAdapter adapter, AttendanceSubItem.SubItemViewHolder holder, int position, List payloads) {
|
||||
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, SubItemViewHolder holder,
|
||||
int position, List<Object> payloads) {
|
||||
holder.onBind(lesson);
|
||||
}
|
||||
|
||||
|
@ -21,12 +21,10 @@ public interface AttendanceTabContract {
|
||||
|
||||
interface Presenter extends BaseContract.Presenter<AttendanceTabContract.View> {
|
||||
|
||||
void onFragmentSelected(boolean isSelected);
|
||||
void onFragmentActivated(boolean isSelected);
|
||||
|
||||
void setArgumentDate(String date);
|
||||
|
||||
void onStart(AttendanceTabContract.View view, boolean isPrimary);
|
||||
|
||||
void onRefresh();
|
||||
}
|
||||
}
|
||||
|
@ -27,12 +27,6 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
||||
|
||||
private static final String ARGUMENT_KEY = "date";
|
||||
|
||||
private static final String SAVED_KEY = "isSelected";
|
||||
|
||||
private boolean isPrimary = false;
|
||||
|
||||
private boolean isSelected = false;
|
||||
|
||||
@BindView(R.id.attendance_tab_fragment_recycler)
|
||||
RecyclerView recyclerView;
|
||||
|
||||
@ -51,6 +45,8 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
||||
@Inject
|
||||
FlexibleAdapter<AttendanceHeaderItem> adapter;
|
||||
|
||||
private boolean isFragmentVisible = false;
|
||||
|
||||
public static AttendanceTabFragment newInstance(String date) {
|
||||
AttendanceTabFragment fragmentTab = new AttendanceTabFragment();
|
||||
|
||||
@ -61,15 +57,6 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
||||
return fragmentTab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
isSelected = savedInstanceState.getBoolean(SAVED_KEY, isSelected);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
@ -84,7 +71,8 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
||||
presenter.setArgumentDate(getArguments().getString(ARGUMENT_KEY));
|
||||
}
|
||||
|
||||
presenter.onStart(this, isPrimary);
|
||||
presenter.onStart(this);
|
||||
presenter.onFragmentActivated(isFragmentVisible);
|
||||
}
|
||||
return view;
|
||||
}
|
||||
@ -111,10 +99,9 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
||||
@Override
|
||||
public void setMenuVisibility(boolean menuVisible) {
|
||||
super.setMenuVisibility(menuVisible);
|
||||
if (presenter != null && getView() != null) {
|
||||
presenter.onFragmentSelected(isSelected);
|
||||
} else if (isSelected) {
|
||||
isPrimary = true;
|
||||
isFragmentVisible = menuVisible;
|
||||
if (presenter != null) {
|
||||
presenter.onFragmentActivated(menuVisible);
|
||||
}
|
||||
}
|
||||
|
||||
@ -143,10 +130,6 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
||||
noItemView.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
|
||||
}
|
||||
|
||||
public void setSelected(boolean selected) {
|
||||
isSelected = selected;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(String message) {
|
||||
if (getActivity() != null) {
|
||||
@ -155,15 +138,8 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
outState.putBoolean(SAVED_KEY, isSelected);
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
isPrimary = false;
|
||||
presenter.onDestroy();
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
@ -33,21 +33,22 @@ public class AttendanceTabPresenter extends BasePresenter<AttendanceTabContract.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart(AttendanceTabContract.View view, boolean isPrimary) {
|
||||
public void onStart(AttendanceTabContract.View view) {
|
||||
super.onStart(view);
|
||||
getView().showProgressBar(true);
|
||||
getView().showNoItem(false);
|
||||
onFragmentSelected(isPrimary);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFragmentSelected(boolean isSelected) {
|
||||
if (!isFirstSight && isSelected) {
|
||||
public void onFragmentActivated(boolean isSelected) {
|
||||
if (!isFirstSight && isSelected && isViewAttached()) {
|
||||
isFirstSight = true;
|
||||
|
||||
loadingTask = new AbstractTask();
|
||||
loadingTask.setOnFirstLoadingListener(this);
|
||||
loadingTask.execute();
|
||||
} else if (!isSelected) {
|
||||
cancelAsyncTasks();
|
||||
}
|
||||
}
|
||||
|
||||
@ -157,10 +158,7 @@ public class AttendanceTabPresenter extends BasePresenter<AttendanceTabContract.
|
||||
getRepository().syncAttendance(date);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
isFirstSight = false;
|
||||
|
||||
private void cancelAsyncTasks() {
|
||||
if (refreshTask != null) {
|
||||
refreshTask.cancel(true);
|
||||
refreshTask = null;
|
||||
@ -169,6 +167,12 @@ public class AttendanceTabPresenter extends BasePresenter<AttendanceTabContract.
|
||||
loadingTask.cancel(true);
|
||||
loadingTask = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
cancelAsyncTasks();
|
||||
isFirstSight = false;
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
||||
|
@ -17,20 +17,16 @@ public interface TimetableContract {
|
||||
|
||||
void setAdapterWithTabLayout();
|
||||
|
||||
void setChildFragmentSelected(int position, boolean selected);
|
||||
|
||||
boolean isMenuVisible();
|
||||
}
|
||||
|
||||
@PerActivity
|
||||
interface Presenter extends BaseContract.Presenter<View> {
|
||||
|
||||
void onFragmentVisible(boolean isVisible);
|
||||
|
||||
void onTabSelected(int position);
|
||||
|
||||
void onTabUnselected(int position);
|
||||
void onFragmentActivated(boolean isVisible);
|
||||
|
||||
void onStart(View view, OnFragmentIsReadyListener listener);
|
||||
|
||||
void setRestoredPosition(int position);
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,9 @@ import io.github.wulkanowy.ui.base.BaseFragment;
|
||||
import io.github.wulkanowy.ui.main.OnFragmentIsReadyListener;
|
||||
import io.github.wulkanowy.ui.main.TabsData;
|
||||
|
||||
public class TimetableFragment extends BaseFragment implements TimetableContract.View, TabLayout.OnTabSelectedListener {
|
||||
public class TimetableFragment extends BaseFragment implements TimetableContract.View {
|
||||
|
||||
private static final String CURRENT_ITEM_KEY = "CurrentItem";
|
||||
|
||||
@BindView(R.id.timetable_fragment_viewpager)
|
||||
ViewPager viewPager;
|
||||
@ -44,6 +46,10 @@ public class TimetableFragment extends BaseFragment implements TimetableContract
|
||||
component.inject(this);
|
||||
setButterKnife(ButterKnife.bind(this, view));
|
||||
presenter.onStart(this, (OnFragmentIsReadyListener) getActivity());
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
presenter.setRestoredPosition(savedInstanceState.getInt(CURRENT_ITEM_KEY));
|
||||
}
|
||||
}
|
||||
return view;
|
||||
}
|
||||
@ -52,25 +58,10 @@ public class TimetableFragment extends BaseFragment implements TimetableContract
|
||||
public void setMenuVisibility(boolean menuVisible) {
|
||||
super.setMenuVisibility(menuVisible);
|
||||
if (presenter != null) {
|
||||
presenter.onFragmentVisible(menuVisible);
|
||||
presenter.onFragmentActivated(menuVisible);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabSelected(TabLayout.Tab tab) {
|
||||
presenter.onTabSelected(tab.getPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabUnselected(TabLayout.Tab tab) {
|
||||
presenter.onTabUnselected(tab.getPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabReselected(TabLayout.Tab tab) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTabDataToAdapter(TabsData tabsData) {
|
||||
pagerAdapter.setTabsData(tabsData);
|
||||
@ -79,14 +70,7 @@ public class TimetableFragment extends BaseFragment implements TimetableContract
|
||||
@Override
|
||||
public void setAdapterWithTabLayout() {
|
||||
viewPager.setAdapter(pagerAdapter);
|
||||
|
||||
tabLayout.setupWithViewPager(viewPager);
|
||||
tabLayout.addOnTabSelectedListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setChildFragmentSelected(int position, boolean selected) {
|
||||
((TimetableTabFragment) pagerAdapter.getItem(position)).setSelected(selected);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -107,6 +91,12 @@ public class TimetableFragment extends BaseFragment implements TimetableContract
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
outState.putInt(CURRENT_ITEM_KEY, viewPager.getCurrentItem());
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
presenter.onDestroy();
|
||||
|
@ -19,6 +19,7 @@ import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem;
|
||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||
import eu.davidea.viewholders.ExpandableViewHolder;
|
||||
import io.github.wulkanowy.R;
|
||||
import io.github.wulkanowy.data.db.dao.entities.Day;
|
||||
@ -58,12 +59,13 @@ public class TimetableHeaderItem
|
||||
}
|
||||
|
||||
@Override
|
||||
public HeaderViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
|
||||
public HeaderViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||
return new HeaderViewHolder(view, adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindViewHolder(FlexibleAdapter adapter, HeaderViewHolder holder, int position, List payloads) {
|
||||
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, HeaderViewHolder holder,
|
||||
int position, List<Object> payloads) {
|
||||
holder.onBind(day, getSubItems());
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
||||
|
||||
private OnFragmentIsReadyListener listener;
|
||||
|
||||
private int positionToScroll;
|
||||
private int positionToScroll = 0;
|
||||
|
||||
private boolean isFirstSight = false;
|
||||
|
||||
@ -45,7 +45,10 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
||||
if (dates.isEmpty()) {
|
||||
dates = TimeUtils.getMondaysFromCurrentSchoolYear();
|
||||
}
|
||||
positionToScroll = dates.indexOf(TimeUtils.getDateOfCurrentMonday(true));
|
||||
|
||||
if (positionToScroll == 0) {
|
||||
positionToScroll = dates.indexOf(TimeUtils.getDateOfCurrentMonday(true));
|
||||
}
|
||||
|
||||
if (!isFirstSight) {
|
||||
isFirstSight = true;
|
||||
@ -57,22 +60,12 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFragmentVisible(boolean isVisible) {
|
||||
public void onFragmentActivated(boolean isVisible) {
|
||||
if (isVisible) {
|
||||
getView().setActivityTitle();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabSelected(int position) {
|
||||
getView().setChildFragmentSelected(position, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabUnselected(int position) {
|
||||
getView().setChildFragmentSelected(position, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDoInBackgroundLoading() throws Exception {
|
||||
for (String date : dates) {
|
||||
@ -84,7 +77,6 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
||||
@Override
|
||||
public void onCanceledLoadingAsync() {
|
||||
//do nothing
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -97,6 +89,11 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRestoredPosition(int position) {
|
||||
this.positionToScroll = position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
isFirstSight = false;
|
||||
|
@ -17,6 +17,7 @@ import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||
import eu.davidea.flexibleadapter.items.AbstractSectionableItem;
|
||||
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||
import io.github.wulkanowy.R;
|
||||
import io.github.wulkanowy.data.db.dao.entities.TimetableLesson;
|
||||
@ -27,7 +28,7 @@ public class TimetableSubItem
|
||||
|
||||
private TimetableLesson lesson;
|
||||
|
||||
public TimetableSubItem(TimetableHeaderItem header, TimetableLesson lesson) {
|
||||
TimetableSubItem(TimetableHeaderItem header, TimetableLesson lesson) {
|
||||
super(header);
|
||||
this.lesson = lesson;
|
||||
}
|
||||
@ -62,12 +63,13 @@ public class TimetableSubItem
|
||||
}
|
||||
|
||||
@Override
|
||||
public SubItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
|
||||
public SubItemViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||
return new SubItemViewHolder(view, adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindViewHolder(FlexibleAdapter adapter, SubItemViewHolder holder, int position, List payloads) {
|
||||
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, SubItemViewHolder holder,
|
||||
int position, List<Object> payloads) {
|
||||
holder.onBind(lesson);
|
||||
}
|
||||
|
||||
|
@ -23,12 +23,10 @@ public interface TimetableTabContract {
|
||||
|
||||
interface Presenter extends BaseContract.Presenter<View> {
|
||||
|
||||
void onFragmentSelected(boolean isSelected);
|
||||
void onFragmentActivated(boolean isSelected);
|
||||
|
||||
void setArgumentDate(String date);
|
||||
|
||||
void onStart(View view, boolean isPrimary);
|
||||
|
||||
void onRefresh();
|
||||
}
|
||||
}
|
||||
|
@ -28,12 +28,6 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
||||
|
||||
private static final String ARGUMENT_KEY = "date";
|
||||
|
||||
private static final String SAVED_KEY = "isSelected";
|
||||
|
||||
private boolean isPrimary = false;
|
||||
|
||||
private boolean isSelected = false;
|
||||
|
||||
@BindView(R.id.timetable_tab_fragment_recycler)
|
||||
RecyclerView recyclerView;
|
||||
|
||||
@ -55,6 +49,8 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
||||
@Inject
|
||||
FlexibleAdapter<TimetableHeaderItem> adapter;
|
||||
|
||||
private boolean isFragmentVisible = false;
|
||||
|
||||
public static TimetableTabFragment newInstance(String date) {
|
||||
TimetableTabFragment fragmentTab = new TimetableTabFragment();
|
||||
|
||||
@ -65,14 +61,6 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
||||
return fragmentTab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if (savedInstanceState != null) {
|
||||
isSelected = savedInstanceState.getBoolean(SAVED_KEY, isSelected);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
@ -86,8 +74,8 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
||||
if (getArguments() != null) {
|
||||
presenter.setArgumentDate(getArguments().getString(ARGUMENT_KEY));
|
||||
}
|
||||
|
||||
presenter.onStart(this, isPrimary);
|
||||
presenter.onStart(this);
|
||||
presenter.onFragmentActivated(isFragmentVisible);
|
||||
}
|
||||
return view;
|
||||
}
|
||||
@ -114,10 +102,9 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
||||
@Override
|
||||
public void setMenuVisibility(boolean menuVisible) {
|
||||
super.setMenuVisibility(menuVisible);
|
||||
if (presenter != null && getView() != null) {
|
||||
presenter.onFragmentSelected(isSelected);
|
||||
} else if (isSelected) {
|
||||
isPrimary = true;
|
||||
isFragmentVisible = menuVisible;
|
||||
if (presenter != null) {
|
||||
presenter.onFragmentActivated(menuVisible);
|
||||
}
|
||||
}
|
||||
|
||||
@ -151,10 +138,6 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
||||
noItemView.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
|
||||
}
|
||||
|
||||
public void setSelected(boolean selected) {
|
||||
isSelected = selected;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(String message) {
|
||||
if (getActivity() != null) {
|
||||
@ -163,15 +146,8 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
outState.putBoolean(SAVED_KEY, isSelected);
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
isPrimary = false;
|
||||
presenter.onDestroy();
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
@ -36,21 +36,22 @@ public class TimetableTabPresenter extends BasePresenter<TimetableTabContract.Vi
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart(TimetableTabContract.View view, boolean isPrimary) {
|
||||
public void onStart(TimetableTabContract.View view) {
|
||||
super.onStart(view);
|
||||
getView().showProgressBar(true);
|
||||
getView().showNoItem(false);
|
||||
onFragmentSelected(isPrimary);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFragmentSelected(boolean isSelected) {
|
||||
if (!isFirstSight && isSelected) {
|
||||
public void onFragmentActivated(boolean isSelected) {
|
||||
if (!isFirstSight && isSelected && isViewAttached()) {
|
||||
isFirstSight = true;
|
||||
|
||||
loadingTask = new AbstractTask();
|
||||
loadingTask.setOnFirstLoadingListener(this);
|
||||
loadingTask.execute();
|
||||
} else if (!isSelected) {
|
||||
cancelAsyncTasks();
|
||||
}
|
||||
}
|
||||
|
||||
@ -161,10 +162,7 @@ public class TimetableTabPresenter extends BasePresenter<TimetableTabContract.Vi
|
||||
getRepository().syncTimetable(date);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
isFirstSight = false;
|
||||
|
||||
private void cancelAsyncTasks() {
|
||||
if (refreshTask != null) {
|
||||
refreshTask.cancel(true);
|
||||
refreshTask = null;
|
||||
@ -173,6 +171,12 @@ public class TimetableTabPresenter extends BasePresenter<TimetableTabContract.Vi
|
||||
loadingTask.cancel(true);
|
||||
loadingTask = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
isFirstSight = false;
|
||||
cancelAsyncTasks();
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user