package com.appassit.fragments; import java.util.ArrayList; import java.util.List; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Background; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.res.AnimationRes; import android.content.Intent; import android.support.v4.view.ViewPager; import android.support.v4.widget.SwipeRefreshLayout; import android.view.MenuItem; import android.view.animation.Animation; import android.widget.TextView; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.appassit.R; import com.appassit.activitys.CityActivity_; import com.appassit.activitys.SLAppication; import com.appassit.adapter.FutureWeatherAdapter; import com.appassit.adapter.RealtimeAdapter; import com.appassit.common.Const; import com.appassit.data.GsonWeatherRequest; import com.appassit.data.RequestManager; import com.appassit.db.SunDataHelper; import com.appassit.model.SunModel; import com.appassit.model.city.AreaModel; import com.appassit.service.WeatherUpdateService; import com.appassit.tools.NetUtil; import com.appassit.tools.SharedPrefUtil; import com.appassit.widget.RealtimeWeatherItem; import com.appassit.widget.RealtimeWeatherItem_; import com.appassit.widget.jazzylistview.JazzyListView; import com.appassit.widget.jazzyviewpager.JazzyViewPager; @EFragment(R.layout.fragment_today_weather) public class ToadyFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener { /** 是否第一次进入本Fragment */ protected boolean isFrastEnter = true; protected final static String TAG = "HomeFragment"; private SunDataHelper mSunDB; @ViewById(R.id.tv_city) TextView tvCity; @ViewById(R.id.tv_temp) TextView tvTemp; @ViewById(R.id.tv_weather) TextView tvWeather; @AnimationRes Animation fadeIn; @ViewById(R.id.swipe_layout) SwipeRefreshLayout mSwipeRefreshLayout; private MenuItem mRefreshItem; /** 是否是获取所有城市数据 */ private boolean isGetAllData; /** 今日天气Pager */ @ViewById(R.id.jazzy_pager) JazzyViewPager mViewPager; /** 所有城市天气数据 */ List<SunModel> mSunModels; List<RealtimeWeatherItem> mRealtimeViews; /** 未来天气适配器 */ @Bean FutureWeatherAdapter mFutureWeatherAdapter; /** 未来天气ListView */ @ViewById(R.id.lv_weather) JazzyListView mFutureWeatherListView; /** 当前Page页面 */ private int mCurPageIndex; /** 城市数 */ private int mCityNum; @AfterViews void initFragment() { isFrast(); setHasOptionsMenu(true); initData(); initView(); } private void isFrast() { if (SharedPrefUtil.isFrast()) { // 进入选择城市 CityActivity_.intent(this).startForResult(RealtimeWeatherItem.REQUEST_CODE); SharedPrefUtil.setFrast(); } } @Override public void onStart() { super.onStart(); mViewPager.setCurrentItem(SLAppication.getCurCityIndex()); } private void initData() { mCityNum = SLAppication.getMyArea().size(); mSunDB = new SunDataHelper(SLAppication.getContext()); mSunModels = new ArrayList<SunModel>(); // 获取所有城市天气 if (NetUtil.isNetworkConnected()) { getAllWeatherData(); } else { getDataFromDB(); } } private void initView() { mFutureWeatherListView.setAdapter(mFutureWeatherAdapter); mSwipeRefreshLayout.setOnRefreshListener(this); mSwipeRefreshLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); } private void initViewPager() { mRealtimeViews = new ArrayList<RealtimeWeatherItem>(); for (int i = 0; i < mSunModels.size(); i++) { RealtimeWeatherItem item = RealtimeWeatherItem_.build(getActivity(), this); item.bind(mSunModels.get(i).realtime); mRealtimeViews.add(item); } mViewPager.setTransitionEffect(JazzyViewPager.TransitionEffect.Accordion); mViewPager.setOnPageChangeListener(new MyPageViewListener()); mViewPager.setOffscreenPageLimit(1); mViewPager.setAdapter(new RealtimeAdapter(mRealtimeViews, mViewPager)); mViewPager.setPageMargin(3); mCurPageIndex = mViewPager.getCurrentItem(); } /** * 从数据库中获取数据 */ @Background void getDataFromDB() { for (AreaModel model : SLAppication.getMyArea()) { SunModel sunModel = mSunDB.query(model.getWeatherCode()); if (sunModel != null) { mSunModels.add(sunModel); } } // 更新 updateView(); } /** * 插入数据到数据库 */ @Background void inserData() { mSunDB.deleteAll(); mSunDB.bulkInsert(mSunModels); } private void onRefreshData() { getCityWeatherData(SLAppication.getMyArea().get(mCurPageIndex).getWeatherCode()); } /** * 获取所有城市天气 */ void getAllWeatherData() { isGetAllData = true; // 清除所有数据 setRefreshing(true); mSunModels.clear(); getAllWeather(); } @Background void getAllWeather() { // 获取数据 for (int i = 0; i < SLAppication.getMyArea().size(); i++) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } getWeatherData(SLAppication.getMyArea().get(i).getWeatherCode()); } } // weather code:101021300 /** * 获取某一城市天气 * * @param id */ private void getCityWeatherData(String id) { isGetAllData = false; getWeatherData(id); } /** * 更新页面 */ private void updateView() { // 更新每小时天气 /* * if (activity != null) { * activity.updateHourly(mSunModels.get(mCurPageIndex).hourlyForecast); * } */ // 更新ListView if (mSunModels != null && mSunModels.size() > 0) { mFutureWeatherAdapter.appendToList(mSunModels.get(mCurPageIndex).weather); } // 更新ViewPager initViewPager(); // 插入数据到数据库里 inserData(); setRefreshing(false); } /** * 获取城市信息 * * @param id * 天气WeatherCode */ @SuppressWarnings("unchecked") private void getWeatherData(String id) { executeRequest(new GsonWeatherRequest<SunModel.SunRequestData>(Const.WEATER_INFO_URL + "?app=tq360&_jsonp=renderData&code=" + id, SunModel.SunRequestData.class, responseListener(), errorListener())); } protected void executeRequest(Request<?> request) { RequestManager.addRequest(request, this); } /** * 获取数据成功回调 * * @return */ private Response.Listener<SunModel.SunRequestData> responseListener() { return new Response.Listener<SunModel.SunRequestData>() { @Override public void onResponse(SunModel.SunRequestData sunRequestData) { sunRequestData.data.id = sunRequestData.data.area[2][1]; sunRequestData.data.realtime.cityName = sunRequestData.data.area[2][0]; // 将请求到的数据加入到List中 if (!isGetAllData) { mSunModels.remove(mCurPageIndex); mSunModels.add(mCurPageIndex, sunRequestData.data); } else { mSunModels.add(sunRequestData.data); } // 判断当前的数据是否已经全部获取到,来更新界面 if (!isGetAllData || mSunModels.size() == SLAppication.getMyArea().size()) { updateView(); } } }; } /** * 获取数据错误回调 * * @return */ protected Response.ErrorListener errorListener() { return new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); // 让刷新进度环停止 setRefreshing(false); } }; } @OnActivityResult(RealtimeWeatherItem.REQUEST_CODE) void onResult(int resultCode) { if (resultCode == 1 || mCityNum != SLAppication.getMyArea().size()) { mCityNum = SLAppication.getMyArea().size(); getAllWeatherData(); } } public SunModel getCurSunModel() { if (mSunModels != null && mSunModels.size() != 0) return mSunModels.get(mCurPageIndex); else return null; } @Override public void onRefresh() { if (mSunModels.size() < 1) { getAllWeatherData(); } else { onRefreshData(); } } public void setOnRefresh() { setRefreshing(true); getAllWeatherData(); } /** * 让刷新进度环停止 * * @param refreshing */ private void setRefreshing(boolean refreshing) { mSwipeRefreshLayout.setRefreshing(refreshing); if (mRefreshItem == null) return; if (refreshing) { mRefreshItem.setEnabled(false); mRefreshItem.setActionView(R.layout.actionbar_refresh_progress); } else { mRefreshItem.setEnabled(true); mRefreshItem.setActionView(null); } } /** * ViewPage Listener */ private class MyPageViewListener implements ViewPager.OnPageChangeListener { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { try { // 设置当前城市,并更新Widget SLAppication.setCurCityIndex(mCurPageIndex = position); // LogUtil.i(TAG, // App.getMyArea().get(App.getCurCityIndex()).getCityName()); getActivity().sendBroadcast(new Intent(WeatherUpdateService.ACTION_SWITH_CITY)); // 更新ListView mFutureWeatherListView.startAnimation(fadeIn); mFutureWeatherListView.smoothScrollToPosition(0); mFutureWeatherAdapter.appendToList(mSunModels.get(position).weather); /* * if (activity != null) { * activity.updateHourly(mSunModels.get(mCurPageIndex * ).hourlyForecast); } */ } catch (Exception e) { e.printStackTrace(); } } @Override public void onPageScrollStateChanged(int state) { } } @Override public void onDestroyView() { super.onDestroyView(); RequestManager.cancelAll(this); } }