首先感谢 开源作者
/** * Created by jianghejie on 15/11/26. */的无私奉献 我是在他的基础上做的修改
以前一直是用的XListView 可是 测试发现有一个奇奇怪怪的BUG,我们还无法解决。最严重的是 XListView 里面用的添加头addHeaderView方法在17以前有概率崩溃。后来在同事的项目里看到PullToZoomListViewEx开源代码,实现的很好,但是代码太难懂,感觉扩展性不好。
最后在RecyclerView的强大功能下,还是觉得要用集成RecyclerView的下拉刷新上拉加载的控件才好。
好用集成RecyclerView下拉功能的控件都用到了SwipeRefreshLayout布局,使得下拉样式很官方,不满足产品大大的需求。(其实官方多好的)
后来找到了这款开源的控件XRecyclerView git地址:https://github.com/jianghejie/XRecyclerView 可以看动画效果
掩饰不住内心高兴的心情,下载下来,发现功能太强的了
但是也有很多不足的地方,不必 很多 选择刷新和加载的样式类。其实一般不需要
主要原理就是把重写的Adapter 把我们的mHeader和mFooter (如果需要还有 headviews)重组到Adapter 里面。并且也重写了监听。
这个设计简直就是棒棒哒
还不写人不知到怎么引用 RecyclerView 的架包 其实要完成以上的运行需要 RecyclerView V7中的资源文件 所以是要引用.arr 文件 并不是.jar
至于他们有什么区别 请去百度(弄好了那些 可以用在低版本上哟 我的API就是19)
对了 其实对于这个功能的开发 首先要注意有多少状态 作者对刷新状态分了4种 加载 3种。而我自己应为需求只把刷新和加载都要比作者少一种
废话不多说了 下面上代码 我还自己加了很多注释哟
XRecyclerView类
package com.expect.zbjpulltorefresht.xlayoutview;
import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import com.expect.zbjpulltorefresht.LaoZiDe.XRecyclerViewFooter;
import com.expect.zbjpulltorefresht.LaoZiDe.XRecyclerViewHeader;
import java.util.ArrayList;
/**
* Created by expect_xh on 2016/3/22.
*/
public class XRecyclerView extends RecyclerView {
private Context mContext;//上下文
private ArrayList<View> mHeaderViews = new ArrayList<View>();//头文件列表
private XRecyclerViewHeader mHeader;
private XRecyclerViewFooter mFooter;
private Adapter mAdapter;//传入的Adapter
private Adapter mWrapAdapter;//组合的Adapter
private float mLastY = -1; //记录的Y坐标
private static final float DRAG_RATE = 3;//阻力率
private LoadingListener mLoadingListener;//滑动监听
private boolean pullRefreshEnabled = true; //刷新状态
private boolean loadingMoreEnabled = true; //上拉状态
private static final int TYPE_REFRESH_HEADER = -5; //添加刷新头
private static final int TYPE_HEADER = -4; //添加头部
private static final int TYPE_NORMAL = 0;
private static final int TYPE_FOOTER = -3;//添加上拉加载布局
private int previousTotal = 0;// 记录ITEM的条数
public XRecyclerView(Context context) {
this(context, null);
}
public XRecyclerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public XRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
mContext = context;
if (pullRefreshEnabled) {
XRecyclerViewHeader xRecyclerViewHeader = new XRecyclerViewHeader(mContext);
mHeaderViews.add(0, xRecyclerViewHeader);
mHeader = xRecyclerViewHeader;
}
mFooter = new XRecyclerViewFooter(mContext);
mFooter.setVisibility(GONE);
}
//添加头部文件的时候 判断有没有刷新头
public void addHeaderView(View view) {
if (pullRefreshEnabled && !(mHeaderViews.get(0) instanceof XRecyclerViewHeader)) {
XRecyclerViewHeader xRecyclerViewHeader = new XRecyclerViewHeader(mContext);
mHeaderViews.add(0, xRecyclerViewHeader);
mHeader = xRecyclerViewHeader;
}
mHeaderViews.add(view);
}
public void loadMoreComplete() {//上拉加载完成后的 隐藏上拉加载布局
if (previousTotal < getLayoutManager().getItemCount()) {
mFooter.setState(XRecyclerViewFooter.STATE_COMPLETE);
}
previousTotal = getLayoutManager().getItemCount();
}
public void refreshComplete() {//下拉刷新完成后的 隐藏下拉加载 布局
mHeader.refreshComplate();
}
public void setPullRefreshEnabled(boolean enabled) {//设置是否可以刷新
pullRefreshEnabled = enabled;
}
public void setLoadingMoreEnabled(boolean enabled) {//设置是否可以上拉
loadingMoreEnabled = enabled;
if (!enabled) {
mFooter.setVisibility(GONE);
}
// if (enabled){
// mFooter.setVisibility(VISIBLE);
// }else {
// mFooter.setVisibility(GONE);
// }
// mWrapAdapter.notifyDataSetChanged();
}
@Override
public void setAdapter(Adapter adapter) {
mAdapter = adapter;
mWrapAdapter = new WrapAdapter(mHeaderViews, mFooter, adapter);
super.setAdapter(mWrapAdapter);
mAdapter.registerAdapterDataObserver(mDataObserver);
}
/**
* 活动监听 判断是否到底,用于加载
*/
@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
if (state == RecyclerView.SCROLL_STATE_IDLE && mLoadingListener != null && loadingMoreEnabled) {
LayoutManager layoutManager = getLayoutManager();