package org.lntu.online.ui.activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.LinearInterpolator; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; import org.joda.time.LocalDate; import org.lntu.online.R; import org.lntu.online.model.api.ApiClient; import org.lntu.online.model.api.BackgroundCallback; import org.lntu.online.model.entity.ClassTable; import org.lntu.online.model.storage.CacheShared; import org.lntu.online.model.storage.LoginShared; import org.lntu.online.ui.base.StatusBarActivity; import org.lntu.online.ui.fragment.ClassTablePageFragment; import org.lntu.online.ui.listener.NavigationFinishClickListener; import java.util.ArrayList; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.OnItemSelected; import retrofit.client.Response; public class ClassTableActivity extends StatusBarActivity implements Toolbar.OnMenuItemClickListener { @BindView(R.id.toolbar) protected Toolbar toolbar; @BindView(R.id.spn_year_term) protected Spinner spnYearTerm; @BindView(R.id.layout_loading) protected View layoutLoading; @BindView(R.id.layout_empty) protected View layoutEmpty; @BindView(R.id.layout_fragment) protected ViewGroup layoutFragment; @BindView(R.id.icon_loading_anim) protected View iconLoadingAnim; @BindView(R.id.tv_load_failed) protected TextView tvLoadFailed; private BaseFragment fmPage; private BaseFragment fmList; private final LocalDate today = new LocalDate(); private int currentYear; // 当前查询的年条件 private String currentTerm; // 当前查询的学期条件 private ClassTable classTable; // 当前的课表对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_class_table); ButterKnife.bind(this); toolbar.setNavigationOnClickListener(new NavigationFinishClickListener(this)); toolbar.inflateMenu(R.menu.class_table_page); toolbar.setOnMenuItemClickListener(this); Animation dataLoadAnim = AnimationUtils.loadAnimation(this, R.anim.data_loading); dataLoadAnim.setInterpolator(new LinearInterpolator()); iconLoadingAnim.startAnimation(dataLoadAnim); fmPage = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragement_page); fmList = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragement_list); getSupportFragmentManager().beginTransaction().show(fmPage).hide(fmList).commit(); ArrayAdapter spnAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getYearTermList(today)); spnAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spnYearTerm.setAdapter(spnAdapter); } /** * 获取年级学期数组 */ private List<String> getYearTermList(LocalDate today) { int startYear = 2000 + Integer.parseInt(LoginShared.getUserId(this).substring(0, 2)); int endYear = today.getYear(); endYear = today.getMonthOfYear() < 2 ? endYear - 1 : endYear; endYear = endYear < startYear ? startYear : endYear; String endTerm = (today.getMonthOfYear() >= 2 && today.getMonthOfYear() < 8) ? "春" : "秋"; List<String> yearTermList = new ArrayList<>(); for (int n = 0; n < endYear - startYear; n++) { if (!(endYear - n == endYear && endTerm.equals("春"))) { yearTermList.add(endYear - n + "年 " + "秋季"); } yearTermList.add(endYear - n + "年 " + "春季"); } yearTermList.add(startYear + "年 " + "秋季"); return yearTermList; } /** * 设置年级和学期 */ private void setCurrentYearAndTerm(int year, String term) { fmPage.onDataSetInit(year, term, today); fmList.onDataSetInit(year, term, today); currentYear = year; currentTerm = term; classTable = CacheShared.getClassTable(this, year, term); if (classTable != null) { final Map<String, List<ClassTable.CourseWrapper>> classTableMap = classTable.getMap(); fmPage.onDataSetUpdate(classTable, classTableMap); fmList.onDataSetUpdate(classTable, classTableMap); showLayoutFragment(); } else { showLayoutLoading(); } startNetwork(year, term); } /** * 当前年级和学期切换 */ @OnItemSelected(R.id.spn_year_term) protected void onSpnItemSelected() { String[] itemArr = spnYearTerm.getSelectedItem().toString().split(" "); int year = Integer.parseInt(itemArr[0].replace("年", "")); String term = itemArr[1].replace("季", ""); setCurrentYearAndTerm(year, term); } /** * 菜单点击事件 */ @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.action_class_table_page: toolbar.getMenu().clear(); toolbar.inflateMenu(R.menu.class_table_page); getSupportFragmentManager().beginTransaction().show(fmPage).hide(fmList).commit(); return true; case R.id.action_class_table_list: toolbar.getMenu().clear(); toolbar.inflateMenu(R.menu.class_table_list); getSupportFragmentManager().beginTransaction().show(fmList).hide(fmPage).commit(); return true; case R.id.action_class_table_today: if (classTable != null) { ((ClassTablePageFragment) fmPage).onSetToday(); } return true; default: return false; } } /** * 更新数据 */ private void startNetwork(final int year, final String term) { ApiClient.service.getClassTable(LoginShared.getLoginToken(this), year, term, new BackgroundCallback<ClassTable>(this) { @Override public void handleSuccess(ClassTable classTable, Response response) { CacheShared.setClassTable(ClassTableActivity.this, classTable); if (year == currentYear && term.equals(currentTerm)) { // 如果当前年级和学期没有改变 ClassTableActivity.this.classTable = classTable; Map<String, List<ClassTable.CourseWrapper>> classTableMap = classTable.getMap(); fmPage.onDataSetUpdate(classTable, classTableMap); fmList.onDataSetUpdate(classTable, classTableMap); showLayoutFragment(); } } @Override public void handleFailure(String message) { if (year == currentYear && term.equals(currentTerm) && classTable == null) { // 如果classTable为空,说明是第一次初始化 showLayoutEmpty(message); } } }); } /** * 显示加载状态 */ private void showLayoutLoading() { layoutLoading.setVisibility(View.VISIBLE); layoutEmpty.setVisibility(View.GONE); layoutFragment.setVisibility(View.GONE); } /** * 显示错误状态 */ private void showLayoutEmpty(String message) { layoutLoading.setVisibility(View.GONE); layoutEmpty.setVisibility(View.VISIBLE); layoutFragment.setVisibility(View.GONE); tvLoadFailed.setText(message); } /** * 显示当前容器 */ private void showLayoutFragment() { layoutLoading.setVisibility(View.GONE); layoutEmpty.setVisibility(View.GONE); layoutFragment.setVisibility(View.VISIBLE); } /** * 点击重新加载数据 */ @OnClick(R.id.layout_empty) protected void onBtnIconEmptyClick() { showLayoutLoading(); startNetwork(currentYear, currentTerm); } public static abstract class BaseFragment extends Fragment { public abstract void onDataSetInit(int year, String term, LocalDate today); public abstract void onDataSetUpdate(ClassTable classTable, Map<String, List<ClassTable.CourseWrapper>> classTableMap); } }