package com.jerey.keepgank.fragment; import android.content.res.Resources; import android.graphics.Color; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.support.v7.widget.Toolbar; import android.util.Log; import com.jerey.keepgank.R; import com.jerey.keepgank.View.SlideInOutRightItemAnimator; import com.jerey.keepgank.View.SwipeToRefreshLayout; import com.jerey.keepgank.adapter.MeiziAdapter; import com.jerey.keepgank.bean.Data; import com.jerey.keepgank.net.GankApi; import com.jerey.lruCache.DiskLruCacheManager; import com.orhanobut.logger.Logger; import com.trello.rxlifecycle.FragmentEvent; import java.io.IOException; import butterknife.Bind; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by Xiamin on 2017/3/1. */ public class MeiziFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener{ private static final String TAG = "MeiziFragment"; @Bind(R.id.recycler_view) RecyclerView mRecyclerView; @Bind(R.id.swipe_ly) SwipeToRefreshLayout mSwipeRefreshLayout; @Bind(R.id.toolbar) Toolbar mToolBar; private StaggeredGridLayoutManager mStaggeredGridLayoutManager; //当前页数 private int currentPager = 1; //是否刷新状态 private boolean isLoadingNewData = false; //是否载入更多状态 private boolean isLoadingMore = false; //是否已经载入去全部 private boolean isALlLoad = false; MeiziAdapter mAdapter; private DiskLruCacheManager mDiskLruCacheManager; @Override protected int returnLayoutID() { return R.layout.fragment_meizi; } @Override protected void afterCreate(Bundle savedInstanceState) { ((AppCompatActivity) getActivity()).setSupportActionBar(mToolBar); mToolBar.setTitle("妹子"); mToolBar.setTitleTextColor(Color.WHITE); initRecyclerView(mRecyclerView); initSwipeRefreshLayout(mSwipeRefreshLayout); mAdapter = new MeiziAdapter(getActivity()); mRecyclerView.setAdapter(mAdapter); mRecyclerView.setItemAnimator(new SlideInOutRightItemAnimator(mRecyclerView)); mRecyclerView.addOnScrollListener(mOnScrollListener); try { Log.i(TAG, "DiskLruCacheManager 创建"); mDiskLruCacheManager = new DiskLruCacheManager(getActivity()); Data data = mDiskLruCacheManager.getAsSerializable(TAG); Log.i(TAG, "DiskLruCacheManager 读取"); if (data != null){ Log.i(TAG, "获取到缓存数据"); mAdapter.setData(data.getResults()); mAdapter.notifyDataSetChanged(); } } catch (IOException e) { e.printStackTrace(); } onRefresh(); } private void initRecyclerView(RecyclerView recyclerView) { recyclerView.setHasFixedSize(true); recyclerView.setItemAnimator(new DefaultItemAnimator()); mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(mStaggeredGridLayoutManager); } private void initSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayout) { Resources resources = getResources(); swipeRefreshLayout.setColorSchemeColors(resources.getColor(R.color.blue_dark), resources.getColor(R.color.red_dark), resources.getColor(R.color.yellow_dark), resources.getColor(R.color.green_dark) ); swipeRefreshLayout.setOnRefreshListener(this); } @Override public void onRefresh() { Logger.i("开始刷新"); mSwipeRefreshLayout.setRefreshing(true); isLoadingMore = false; isLoadingNewData = true; loadData(1); } int[] lastPositions; private RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //但RecyclerView滑动到倒数第三个之请求加载更多 if (lastPositions == null) { lastPositions = new int[mStaggeredGridLayoutManager.getSpanCount()]; } int[] lastVisibleItem = mStaggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions); int totalItemCount = mAdapter.getItemCount(); // dy>0 表示向下滑动 if (lastVisibleItem[0] >= totalItemCount - 4 && dy > 0 && !isLoading() && !isALlLoad) { requestMoreData(); } } }; private boolean isLoading() { return isLoadingMore || isLoadingNewData; } private void requestMoreData(){ Logger.i("加载更多"); mSwipeRefreshLayout.setRefreshing(true); isLoadingMore = true; isLoadingNewData = false; loadData(++currentPager); } private void loadData(int pager) { GankApi.getInstance() .getWebService() .getBenefitsGoods(GankApi.LOAD_LIMIT,pager) .compose(this.<Data>bindUntilEvent(FragmentEvent.DESTROY_VIEW)) .cache() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(dataObservable); } private Observer<Data> dataObservable = new Observer<Data>(){ @Override public void onCompleted() { Logger.i("数据onCompleted 停止刷新"); mSwipeRefreshLayout.setRefreshing(false); isLoadingNewData = false; isLoadingMore = false; } @Override public void onError(Throwable e) { Logger.i("onError 停止刷新"); mSwipeRefreshLayout.setRefreshing(false); isLoadingNewData = false; isLoadingMore = false; showSnackbar("OnError"); } @Override public void onNext(Data data) { Logger.i("onNext " + data.toString()); if(data != null && data.getResults() != null){ /** * 没有更多数据 */ if (data.getResults().size() < GankApi.LOAD_LIMIT) { isALlLoad = true; showSnackbar(R.string.no_more); } if(isLoadingMore){ mAdapter.addData(data.getResults()); } else if (isLoadingNewData) { isALlLoad = false; mAdapter.setData(data.getResults()); Log.i(TAG, "DiskLruCacheManager 写入"); mDiskLruCacheManager.put(TAG,data); } mAdapter.notifyDataSetChanged(); } } }; }