package licola.demo.com.huabandemo.Base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import java.util.List;
import butterknife.BindView;
import licola.demo.com.huabandemo.API.OnFragmentRefreshListener;
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.Subscription;
import rx.functions.Func1;
/**
* Created by LiCola on 2016/03/26 16:55
* BaseRecyclerHeadFragment 抽象出来作为模板类
* 采用泛型 约束条件是RecyclerView.Adapter
* 作用在于:固定通用方法确定整体结构 然后具体算法实现在子类中实现扩展 还确保了子类的拓展
* 定义成抽象类:既要约束子类的行为,又为子类提供公共功能
* 所以:模板方法的基类只提供通用功能和确定骨架,而不应该决定逻辑跳转等具体子类的功能
*/
public abstract class BaseRecyclerHeadFragment
<T extends RecyclerView.Adapter, K extends List> extends BaseFragment
implements OnFragmentRefreshListener {
protected static final String TYPE_KEY = "KEY";//搜索关键字的key值
protected final float percentageScroll = 0.8f;//滑动距离的百分比
protected String mKey;//用于联网查询的关键字
protected static int mLimit = Constant.LIMIT;
protected boolean isFistHttp = true;//是否第一次联网
//是否还监听滑动的联网 标志位 默认为true 表示需要监听
protected boolean isScorllLisener = true;
@BindView(R.id.recycler_list)
protected RecyclerView mRecyclerView;
// protected RecyclerPinsHeadCardAdapter mAdapter;
protected T mAdapter;
//能显示三种状态的 footView
protected LoadingFooter mFooterView;
@Override
protected int getLayoutId() {
return R.layout.fragment_recycler;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getBundleData(getArguments());
}
/**
* 取bundle值的方法 可以被子类重写
*
* @param args
*/
protected void getBundleData(Bundle args) {
if (args != null) {
mKey = args.getString(TYPE_KEY);//父类取出key
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initRecyclerView();
initListener();
addSubscription(getHttpOther());
addSubscription(getHttpFirst());
}
//界面初始化的其他联网 可以不重写
protected Subscription getHttpOther() {
return null;
}
//界面初始化的联网 由子类重写 提供参数判断是否初次联网
protected abstract Subscription getHttpFirst();
protected abstract Subscription getHttpScroll();//滑动产生的联网 由子类重写
@Override
public void getHttpRefresh() {
addSubscription(getHttpFirst());
}
/**
* 提供给子类过滤 网络返回list 并休息ui状态的方法
*
* @return
*/
protected Func1<K, Boolean> getFilterFunc1() {
return new Func1<K, Boolean>() {
@Override
public Boolean call(K k) {
// getFootView();
if (k == null || k.size() == 0) {
if (mFooterView!=null){
mFooterView.setState(LoadingFooter.State.TheEnd);
Logger.d("mFooterView ! = null");
}else {
Logger.d("mFooterView= null");
}
isScorllLisener = false;
return false;
}
if (k.size() < mLimit) {
mFooterView.setState(LoadingFooter.State.TheEnd);
isScorllLisener = false;
return true;
}
return true;
}
};
}
protected View getFootView() {
if (mFooterView == null) {
mFooterView = new LoadingFooter(getActivity());
mFooterView.setState(LoadingFooter.State.Loading);
}
return mFooterView;
}
protected abstract View getHeadView();
//返回当前RecyclerView显示的 holder 位置
protected abstract int getAdapterPosition();
protected abstract T setAdapter(); //这里初始化 adapter
/**
* 初始化监听器的空方法 子类需要重写
*/
protected void initListener() {
}
protected RecyclerView.LayoutManager getLayoutManager() {
return new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
}
private void initRecyclerView() {
//// TODO: 2016/3/17 0017 预留选项 应该在设置中 添加一条单条垂直滚动选项
// LinearLayoutManager layoutManager=new LinearLayoutManager(HuaBanApplication.getInstance());
// mAdapter = new RecyclerPinsHeadCardAdapter(mRecyclerView);
mAdapter = setAdapter();
HeaderAndFooterRecyclerViewAdapter headAdapter = new HeaderAndFooterRecyclerViewAdapter(mAdapter);
mRecyclerView.setAdapter(headAdapter);
mRecyclerView.setLayoutManager(getLayoutManager());
//绑定能添加头尾View的adapter后 检查View返回 添加
if (getHeadView() != null) {
RecyclerViewUtils.addHearView(mRecyclerView, getHeadView());
}
if (getFootView() != null) {
RecyclerViewUtils.addFootView(mRecyclerView, getFootView());
}
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 (getAdapterPosition() >= --size && isScorllLisener) {
addSubscription(getHttpScroll());
}
} else if (RecyclerView.SCROLL_STATE_DRAGGING == newState) {
//用户正在滑动
// Logger.d("用户正在滑动 position=" + mAdapter.getAdapterPosition());
} else {
//惯性滑动
// Logger.d("惯性滑动 position=" + mAdapter.getAdapterPosition());
}
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
// EventBus.getDefault().unregister(this);
}
}