XRecyclerView实现RecyclerView下拉刷新上来加载 自己做了部分修改,使代码更简洁易用

首先感谢 开源作者

/**
 * 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();
   
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值