package licola.demo.com.huabandemo.Module.Type;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.ProgressBar;
import java.util.List;
import org.greenrobot.eventbus.EventBus;
import butterknife.BindView;
import licola.demo.com.huabandemo.API.Fragment.OnPinsFragmentInteractionListener;
import licola.demo.com.huabandemo.API.HttpsAPI.TypeAPI;
import licola.demo.com.huabandemo.Adapter.RecyclerPinsHeadCardAdapter;
import licola.demo.com.huabandemo.Base.BaseFragment;
import licola.demo.com.huabandemo.Entity.ListPinsBean;
import licola.demo.com.huabandemo.Entity.PinsMainEntity;
import licola.demo.com.huabandemo.HttpUtils.RetrofitClient;
import licola.demo.com.huabandemo.Module.Main.MainActivity;
import licola.demo.com.huabandemo.R;
import licola.demo.com.huabandemo.Util.Constant;
import licola.demo.com.huabandemo.Util.Logger;
import licola.demo.com.huabandemo.Widget.LoadingFooter;
import licola.demo.com.huabandemo.Widget.MyRecyclerview.HeaderAndFooterRecyclerViewAdapter;
import licola.demo.com.huabandemo.Widget.MyRecyclerview.RecyclerViewUtils;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by LiCola on 2015/11/28 18:00
* 展示各个模块的Fragment 在Main和Module Activity负责展示UI
*/
public class TypeFragment extends BaseFragment {
private final float percentageScroll = 0.8f;//滑动距离的百分比
private int mMaxId = 0;
protected static final String TYPE_KEY = "TYPE_KEY";
protected static final String TYPE_TITLE = "TYPE_TITLE";
protected String type;
protected String title;
private static int limit = Constant.LIMIT;
@BindView(R.id.recycler_list)
RecyclerView mRecyclerView;
@BindView(R.id.swipe_refresh_widget)
SwipeRefreshLayout mSwipeRefresh;
@BindView(R.id.progressBar_recycler)
ProgressBar mProgressBar;
// private MainRecyclerViewAdapter mAdapter;
// private RecyclerPinsCardAdapter mAdapter;
private RecyclerPinsHeadCardAdapter mAdapter;
private OnPinsFragmentInteractionListener mListener;
public static TypeFragment newInstance(String type, String title) {
TypeFragment fragment = new TypeFragment();
Bundle args = new Bundle();
args.putString(TYPE_KEY, type);
args.putString(TYPE_TITLE, title);
fragment.setArguments(args);
return fragment;
}
@Override
protected int getLayoutId() {
return R.layout.fragment_module;
}
@Override
protected String getTAG() {
return this.toString();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
type = args.getString(TYPE_KEY);
title = args.getString(TYPE_TITLE);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mSwipeRefresh.setColorSchemeResources(R.color.pink_300, R.color.pink_500, R.color.pink_700, R.color.pink_900);
initRecyclerView();
initListener();
getHttpFirstAndRefresh();//默认的联网,区分于滑动的联网加载
}
private void initRecyclerView() {
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
//// TODO: 2016/3/17 0017 预留选项 应该在设置中 添加一条单条垂直滚动选项
// LinearLayoutManager layoutManager=new LinearLayoutManager(HuaBanApplication.getInstance());
// mAdapter = new MainRecyclerViewAdapter(HuaBanApplication.getInstance());
mAdapter = new RecyclerPinsHeadCardAdapter(mRecyclerView);//正常adapter的初始化
//转换成headAdapter
HeaderAndFooterRecyclerViewAdapter headAdapter = new HeaderAndFooterRecyclerViewAdapter(mAdapter);
mRecyclerView.setAdapter(headAdapter);
mRecyclerView.setLayoutManager(layoutManager);
LoadingFooter loadingFooter = new LoadingFooter(getContext());
loadingFooter.setState(LoadingFooter.State.Loading);
RecyclerViewUtils.addFootView(mRecyclerView, loadingFooter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());//设置默认动画
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (RecyclerView.SCROLL_STATE_IDLE == newState) {
//滑动停止
// Logger.d("滑动停止 position=" + mAdapter.getAdapterPosition());
int size = (int) (mAdapter.getItemCount() * percentageScroll);
if (mAdapter.getAdapterPosition() >= --size) {
getHttpMaxId(mMaxId);
}
} else if (RecyclerView.SCROLL_STATE_DRAGGING == newState) {
//用户正在滑动
// Logger.d("用户正在滑动 position=" + mAdapter.getAdapterPosition());
} else {
//惯性滑动
// Logger.d("惯性滑动 position=" + mAdapter.getAdapterPosition());
}
}
});
}
/**
* 根据max值联网 在滑动时调用 继续加载后续内容
*/
private void getHttpMaxId(int max) {
Subscription s = RetrofitClient.createService(TypeAPI.class)
.httpsTypeMaxLimitRx(mAuthorization, type, max, limit)
.map(new Func1<ListPinsBean, List<PinsMainEntity>>() {
@Override
public List<PinsMainEntity> call(ListPinsBean listPinsBean) {
//取出list对象
return listPinsBean.getPins();
}
})
.filter(new Func1<List<PinsMainEntity>, Boolean>() {
@Override
public Boolean call(List<PinsMainEntity> pinsEntities) {
//检查非空
return pinsEntities.size() > 0;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<PinsMainEntity>>() {
@Override
public void onCompleted() {
Logger.d();
}
@Override
public void onError(Throwable e) {
Logger.d();
checkException(e);//检查错误 弹出提示
}
@Override
public void onNext(List<PinsMainEntity> pinsEntities) {
Logger.d();
mMaxId = getMaxId(pinsEntities);
mAdapter.addListNotify(pinsEntities);
}
});
addSubscription(s);
}
/**
* 联网得到内容 每次都会清空之前内容
*/
private void getHttpFirstAndRefresh() {
Subscription s = RetrofitClient.createService(TypeAPI.class)
.httpsTypeLimitRx(mAuthorization, type, limit)
.filter(new Func1<ListPinsBean, Boolean>() {
@Override
public Boolean call(ListPinsBean Bean) {
//过滤掉数组为0的next
return Bean.getPins().size() != 0;
}
})
.map(new Func1<ListPinsBean, List<PinsMainEntity>>() {
@Override
public List<PinsMainEntity> call(ListPinsBean listPinsBean) {
return listPinsBean.getPins();
}
})
.subscribeOn(Schedulers.io())//发布者的运行线程 联网操作属于IO操作
.observeOn(AndroidSchedulers.mainThread())//订阅者的运行线程 在main线程中才能修改UI
.subscribe(new Subscriber<List<PinsMainEntity>>() {
@Override
public void onStart() {
super.onStart();
Logger.d();
// mSwipeRefresh.setRefreshing(true);
setRecyclerProgressVisibility(false);
}
@Override
public void onCompleted() {
Logger.d();
mSwipeRefresh.setRefreshing(false);
setRecyclerProgressVisibility(true);
}
@Override
public void onError(Throwable e) {
Logger.d(e.toString());
mSwipeRefresh.setRefreshing(false);
setRecyclerProgressVisibility(true);
checkException(e);//检查错误 弹出提示
}
@Override
public void onNext(List<PinsMainEntity> result) {
Logger.d();
//保存maxId值 后续加载需要
mMaxId = getMaxId(result);
mAdapter.setListNotify(result);
}
});
addSubscription(s);
}
/**
* true 显示recycler 隐藏progress
*
* @param isShowRecycler
*/
private void setRecyclerProgressVisibility(boolean isShowRecycler) {
if (mRecyclerView != null) {
mRecyclerView.setVisibility(isShowRecycler ? View.VISIBLE : View.GONE);
}
if (mProgressBar != null) {
mProgressBar.setVisibility(isShowRecycler ? View.GONE : View.VISIBLE);
}
}
/**
* 从返回联网结果中保存max值 用于下次联网的关键
*
* @param result
* @return
*/
private int getMaxId(List<PinsMainEntity> result) {
return result.get(result.size() - 1).getPin_id();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnPinsFragmentInteractionListener) {
mListener = (OnPinsFragmentInteractionListener) context;
} else {
throwRuntimeException(context);
}
if (context instanceof MainActivity) {
mAuthorization=((MainActivity)context).mAuthorization;
} else if (context instanceof TypeActivity) {
mAuthorization=((TypeActivity)context).mAuthorization;
}
}
private void initListener() {
//swipeRefresh 控件的滑动监听
mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
getHttpFirstAndRefresh();
}
});
mAdapter.setOnClickItemListener(new RecyclerPinsHeadCardAdapter.OnAdapterListener() {
@Override
public void onClickImage(PinsMainEntity bean, View view) {
Logger.d();
EventBus.getDefault().postSticky(bean);
mListener.onClickPinsItemImage(bean, view);
}
@Override
public void onClickTitleInfo(PinsMainEntity bean, View view) {
Logger.d();
EventBus.getDefault().postSticky(bean);
mListener.onClickPinsItemText(bean, view);
}
@Override
public void onClickInfoGather(PinsMainEntity bean, View view) {
Logger.d();
}
@Override
public void onClickInfoLike(PinsMainEntity bean, View view) {
Logger.d(bean.toString());
// int count=bean.getLike_count()+1;
// bean.setLike_count(count);
// mAdapter.notifyDataSetChanged();
startLike();
}
});
}
private void startLike() {
}
@Override
public void onDestroyView() {
super.onDestroyView();
}
@Override
public void onDestroy() {
super.onDestroy();
mAdapter = null;
// EventBus.getDefault().unregister(this);
}
}