package com.example.jingbin.cloudreader.ui.gank.child; import android.databinding.DataBindingUtil; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import com.bumptech.glide.Glide; import com.example.jingbin.cloudreader.R; import com.example.jingbin.cloudreader.adapter.EmptyAdapter; import com.example.jingbin.cloudreader.adapter.EverydayAdapter; import com.example.jingbin.cloudreader.app.Constants; import com.example.jingbin.cloudreader.base.BaseFragment; import com.example.jingbin.cloudreader.bean.AndroidBean; import com.example.jingbin.cloudreader.bean.FrontpageBean; import com.example.jingbin.cloudreader.databinding.FooterItemEverydayBinding; import com.example.jingbin.cloudreader.databinding.FragmentEverydayBinding; import com.example.jingbin.cloudreader.databinding.HeaderItemEverydayBinding; import com.example.jingbin.cloudreader.http.RequestImpl; import com.example.jingbin.cloudreader.http.cache.ACache; import com.example.jingbin.cloudreader.http.rx.RxBus; import com.example.jingbin.cloudreader.http.rx.RxBusBaseMessage; import com.example.jingbin.cloudreader.http.rx.RxCodeConstants; import com.example.jingbin.cloudreader.model.EverydayModel; import com.example.jingbin.cloudreader.utils.CommonUtils; import com.example.jingbin.cloudreader.utils.DebugUtil; import com.example.jingbin.cloudreader.utils.GlideImageLoader; import com.example.jingbin.cloudreader.utils.PerfectClickListener; import com.example.jingbin.cloudreader.utils.SPUtils; import com.example.jingbin.cloudreader.utils.TimeUtil; import com.example.jingbin.cloudreader.view.webview.WebViewActivity; import com.youth.banner.listener.OnBannerClickListener; import java.util.ArrayList; import java.util.List; import rx.Subscription; /** * 每日推荐 * 更新逻辑:判断是否是第二天(相对于2016-11-26) * 是:判断是否是大于12:30 * ***** |是:刷新当天数据 * ***** |否:使用缓存:|无:请求前一天数据,直到请求到数据为止 * ********** |有:使用缓存 * 否:使用缓存 : |无:请求今天数据 * ********** |有:使用缓存 */ public class EverydayFragment extends BaseFragment<FragmentEverydayBinding> { private static final String TAG = "EverydayFragment"; private ACache maCache; private ArrayList<List<AndroidBean>> mLists; private ArrayList<String> mBannerImages; private EverydayModel mEverydayModel; private HeaderItemEverydayBinding mHeaderBinding; private FooterItemEverydayBinding mFooterBinding; private View mHeaderView; private View mFooterView; private EverydayAdapter mEverydayAdapter; private boolean mIsPrepared = false; private boolean mIsFirst = true; // 是否是上一天的请求 private boolean isOldDayRequest; private RotateAnimation animation; // 记录请求的日期 String year = getTodayTime().get(0); String month = getTodayTime().get(1); String day = getTodayTime().get(2); @Override public int setContent() { return R.layout.fragment_everyday; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // showLoading(); showContentView(); bindingView.llLoading.setVisibility(View.VISIBLE); animation = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setDuration(3000);//设置动画持续时间 animation.setInterpolator(new LinearInterpolator());//不停顿 animation.setRepeatCount(10); bindingView.ivLoading.setAnimation(animation); animation.startNow(); maCache = ACache.get(getContext()); mEverydayModel = new EverydayModel(); mBannerImages = (ArrayList<String>) maCache.getAsObject(Constants.BANNER_PIC); DebugUtil.error("----mBannerImages: " + (mBannerImages == null)); DebugUtil.error("----mLists: " + (mLists == null)); mHeaderBinding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.header_item_everyday, null, false); // 设置本地数据点击事件等 initLocalSetting(); initRecyclerView(); mIsPrepared = true; /** * 因为启动时先走loadData()再走onActivityCreated, * 所以此处要额外调用load(),不然最初不会加载内容 */ loadData(); } /** * 获取当天日期 */ private ArrayList<String> getTodayTime() { String data = TimeUtil.getData(); String[] split = data.split("-"); String year = split[0]; String month = split[1]; String day = split[2]; ArrayList<String> list = new ArrayList<>(); list.add(year); list.add(month); list.add(day); return list; } @Override protected void loadData() { // 显示时轮播图滚动 if (mHeaderBinding != null && mHeaderBinding.banner != null) { mHeaderBinding.banner.startAutoPlay(); mHeaderBinding.banner.setDelayTime(4000); } if (!mIsVisible || !mIsPrepared) { return; } String oneData = SPUtils.getString("everyday_data", "2016-11-26"); if (!oneData.equals(TimeUtil.getData())) {// 是第二天 if (TimeUtil.isRightTime()) {//大于12:30,请求 isOldDayRequest = false; mEverydayModel.setData(getTodayTime().get(0), getTodayTime().get(1), getTodayTime().get(2)); showRotaLoading(true); loadBannerPicture(); showContentData(); } else {// 小于,取缓存没有请求前一天 ArrayList<String> lastTime = TimeUtil.getLastTime(getTodayTime().get(0), getTodayTime().get(1), getTodayTime().get(2)); mEverydayModel.setData(lastTime.get(0), lastTime.get(1), lastTime.get(2)); year = lastTime.get(0); month = lastTime.get(1); day = lastTime.get(2); isOldDayRequest = true;// 是昨天 getACacheData(); } } else {// 当天,取缓存没有请求当天 isOldDayRequest = false; getACacheData(); } } private void initLocalSetting() { mEverydayModel.setData(getTodayTime().get(0), getTodayTime().get(1), getTodayTime().get(2)); // DebugUtil.error("" + year + month + day); // 显示日期,去掉第一位的"0" mHeaderBinding.includeEveryday.tvDailyText.setText(getTodayTime().get(2).indexOf("0") == 0 ? getTodayTime().get(2).replace("0", "") : getTodayTime().get(2)); mHeaderBinding.includeEveryday.ibXiandu.setOnClickListener(new PerfectClickListener() { @Override protected void onNoDoubleClick(View v) { WebViewActivity.loadUrl(v.getContext(), "https://gank.io/xiandu", "加载中..."); } }); mHeaderBinding.includeEveryday.ibMovieHot.setOnClickListener(new PerfectClickListener() { @Override protected void onNoDoubleClick(View v) { RxBus.getDefault().post(RxCodeConstants.JUMP_TYPE_TO_ONE, new RxBusBaseMessage()); } }); } /** * 取缓存 */ private void getACacheData() { if (!mIsFirst) { return; } if (mBannerImages != null && mBannerImages.size() > 0) { mHeaderBinding.banner.setImages(mBannerImages).setImageLoader(new GlideImageLoader()).start(); } else { loadBannerPicture(); } mLists = (ArrayList<List<AndroidBean>>) maCache.getAsObject(Constants.EVERYDAY_CONTENT); if (mLists != null && mLists.size() > 0) { setAdapter(mLists); } else { showRotaLoading(true); showContentData(); } } /** * 加载正文内容 */ private void showContentData() { mEverydayModel.showRecyclerViewData(new RequestImpl() { @Override public void loadSuccess(Object object) { if (mLists != null) { mLists.clear(); } mLists = (ArrayList<List<AndroidBean>>) object; if (mLists.size() > 0 && mLists.get(0).size() > 0) { setAdapter(mLists); } else { requestBeforeData(); } } @Override public void loadFailed() { if (mLists != null && mLists.size() > 0) { return; } showError(); } @Override public void addSubscription(Subscription subscription) { EverydayFragment.this.addSubscription(subscription); } }); } /** * 没请求到数据就取缓存,没缓存一直请求前一天数据 */ private void requestBeforeData() { mLists = (ArrayList<List<AndroidBean>>) maCache.getAsObject(Constants.EVERYDAY_CONTENT); if (mLists != null && mLists.size() > 0) { setAdapter(mLists); } else { // 一直请求,知道请求到数据为止 ArrayList<String> lastTime = TimeUtil.getLastTime(year, month, day); mEverydayModel.setData(lastTime.get(0), lastTime.get(1), lastTime.get(2)); year = lastTime.get(0); month = lastTime.get(1); day = lastTime.get(2); showContentData(); } } /** * 无数据返回时,暂时去掉 */ private void setEmptyAdapter() { showRotaLoading(false); EmptyAdapter emptyAdapter = new EmptyAdapter(); ArrayList<String> list = new ArrayList<>(); list.add(CommonUtils.getString(R.string.string_everyday_empty)); emptyAdapter.addAll(list); bindingView.xrvEveryday.setAdapter(emptyAdapter); // 保存请求的日期 SPUtils.putString("everyday_data", TimeUtil.getData()); mIsFirst = false; } private void initRecyclerView() { bindingView.xrvEveryday.setPullRefreshEnabled(false); bindingView.xrvEveryday.setLoadingMoreEnabled(false); if (mHeaderView == null) { mHeaderView = mHeaderBinding.getRoot(); bindingView.xrvEveryday.addHeaderView(mHeaderView); } if (mFooterView == null) { mFooterBinding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.footer_item_everyday, null, false); mFooterView = mFooterBinding.getRoot(); bindingView.xrvEveryday.addFootView(mFooterView, true); bindingView.xrvEveryday.noMoreLoading(); } bindingView.xrvEveryday.setLayoutManager(new LinearLayoutManager(getContext())); // 需加,不然滑动不流畅 bindingView.xrvEveryday.setNestedScrollingEnabled(false); bindingView.xrvEveryday.setHasFixedSize(false); bindingView.xrvEveryday.setItemAnimator(new DefaultItemAnimator()); } private void setAdapter(ArrayList<List<AndroidBean>> lists) { showRotaLoading(false); if (mEverydayAdapter == null) { mEverydayAdapter = new EverydayAdapter(); } else { mEverydayAdapter.clear(); } mEverydayAdapter.addAll(lists); // DebugUtil.error("----111111 "); // bindingView.xrvEveryday.setAdapter(mEverydayAdapter); // mEverydayAdapter.notifyDataSetChanged(); // DebugUtil.error("----222222 "); maCache.remove(Constants.EVERYDAY_CONTENT); // 缓存三天,这样就可以取到缓存了! maCache.put(Constants.EVERYDAY_CONTENT, lists, 259200); if (isOldDayRequest) { ArrayList<String> lastTime = TimeUtil.getLastTime(getTodayTime().get(0), getTodayTime().get(1), getTodayTime().get(2)); SPUtils.putString("everyday_data", lastTime.get(0) + "-" + lastTime.get(1) + "-" + lastTime.get(2)); } else { // 保存请求的日期 SPUtils.putString("everyday_data", TimeUtil.getData()); } mIsFirst = false; bindingView.xrvEveryday.setAdapter(mEverydayAdapter); mEverydayAdapter.notifyDataSetChanged(); } @Override protected void onInvisible() { // 不可见时轮播图停止滚动 if (mHeaderBinding != null && mHeaderBinding.banner != null) { mHeaderBinding.banner.stopAutoPlay(); } } @Override public void onResume() { super.onResume(); // 失去焦点,否则RecyclerView第一个item会回到顶部 bindingView.xrvEveryday.setFocusable(false); DebugUtil.error("-----EverydayFragment----onResume()"); // 开始图片请求 Glide.with(getActivity()).resumeRequests(); } @Override public void onPause() { super.onPause(); DebugUtil.error("-----EverydayFragment----onPause()"); // 停止全部图片请求 跟随着Activity Glide.with(getActivity()).pauseRequests(); } private void loadBannerPicture() { mEverydayModel.showBanncerPage(new RequestImpl() { @Override public void loadSuccess(Object object) { if (mBannerImages == null) { mBannerImages = new ArrayList<String>(); } else { mBannerImages.clear(); } FrontpageBean bean = (FrontpageBean) object; if (bean != null && bean.getResult() != null && bean.getResult().getFocus() != null && bean.getResult().getFocus().getResult() != null) { final List<FrontpageBean.ResultBeanXXXXXXXXXXXXXX.FocusBean.ResultBeanX> result = bean.getResult().getFocus().getResult(); if (result != null && result.size() > 0) { for (int i = 0; i < result.size(); i++) { //获取所有图片 mBannerImages.add(result.get(i).getRandpic()); } mHeaderBinding.banner.setImages(mBannerImages).setImageLoader(new GlideImageLoader()).start(); mHeaderBinding.banner.setOnBannerClickListener(new OnBannerClickListener() { @Override public void OnBannerClick(int position) { position = position - 1; // 链接没有做缓存,如果轮播图使用的缓存则点击图片无效 if (result.get(position) != null && result.get(position).getCode() != null && result.get(position).getCode().startsWith("http")) { WebViewActivity.loadUrl(getContext(), result.get(position).getCode(), "加载中..."); } } }); maCache.remove(Constants.BANNER_PIC); maCache.put(Constants.BANNER_PIC, mBannerImages, 30000); } } } @Override public void loadFailed() { } @Override public void addSubscription(Subscription subscription) { EverydayFragment.this.addSubscription(subscription); } }); } private void showRotaLoading(boolean isLoading) { if (isLoading) { bindingView.llLoading.setVisibility(View.VISIBLE); bindingView.xrvEveryday.setVisibility(View.GONE); animation.startNow(); } else { bindingView.llLoading.setVisibility(View.GONE); bindingView.xrvEveryday.setVisibility(View.VISIBLE); animation.cancel(); } } @Override protected void onRefresh() { showContentView(); showRotaLoading(true); loadData(); } @Override public void onDestroy() { super.onDestroy(); DebugUtil.error("--EverydayFragment ----onDestroy"); } }