RecyclerView和ListView实现上下拉刷新的方式的汇总

RecyclerView实现上下拉刷新的方式:

常用的三种:

第一种:

SwipeRefreshLayout  这是goolge官方提供的实现下拉刷新的方式用法是用SwipeRefreshLayout包裹RecyclerView
SwipeRefreshLayout对象控件上设置下拉刷新的效果  
至于上拉刷新可以通过给RecyclerView添加addScrollListener()这个监听来实现,具体代码实现如下:

        //只有下拉刷新效果
        refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                if(curPage!=1)
                {
                    curPage=1;
                    initData(curPage);
                    //数据加载完之后就将刷新撤掉

                }
                refreshLayout.setRefreshing(false);
            }
        });
        /*
         *上拉加载下一页
         */
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            //滚动状态改变回调方法
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //如果数据源中的数据都已经显示出来且屏幕停止了滚动 那么开始加载下一屏幕的数据
                if ((lastVisibleItemPosition+1==adapter.getItemCount()&&(newState ==RecyclerView.SCROLL_STATE_IDLE)))
                {
                    curPage ++;
                    initData(curPage);
                }

            }
            //滚动停止之后回调的方法
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //停止滚动之后用布局管理器获取最后一个可见的item的位置
                lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
            }
        });
第二种引入第三方控件

in.srain.cube.views.ptr.PtrFrameLayout 在gradle中导包使用方式也是把recyclerView包裹
具体的实现上下拉刷新的 代码如下:
        //效果1 :设置默认的经典头视图
        PtrClassicDefaultHeader header =new PtrClassicDefaultHeader(context);
        //效果2:特殊效果 目前只支持英文字符(闪动的文字header效果)
        final StoreHouseHeader storeHouseHeader =new StoreHouseHeader(this);
        //storeHouseHeader.setPadding(0,30,0,0);
        //头上文字背景颜色
        storeHouseHeader.setBackgroundColor(Color.BLUE);
        //头上文字颜色
        storeHouseHeader.setTextColor(Color.WHITE);
        //设置显示的文字 文字只可以是字母或者数字
        storeHouseHeader.initWithString("LOADING...");
        //为PtrFrameLayout设置下拉刷新的头视图
        ptrFrameLayout.setHeaderView(storeHouseHeader);
        //绑定ui与刷新状态的监听
        ptrFrameLayout.addPtrUIHandler(storeHouseHeader);
        ptrFrameLayout.autoRefresh(true);
        //添加刷新的动作监听
        ptrFrameLayout.setPtrHandler(new PtrDefaultHandler() {
            @Override
            public void onRefreshBegin(PtrFrameLayout frame) {
                 /*
                  *youwent
                  */
                   curPage =1;

                   loadData(curPage);



            }
        });


      //设置上拉刷新
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if ((lastVisibleItemPosition+1==adapter.getItemCount())&&newState==RecyclerView.SCROLL_STATE_IDLE)
                {
                    curPage++;
                    loadData(curPage);
                    Log.i(" curPage = ;","=======>"+curPage);


                }
            }
         //滚动完后才能之后 的回调
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //当前页面最后一个可见元素位置
               lastVisibleItemPosition = manager.findLastVisibleItemPosition();

            }
        });
第三种是引用github上一位大神写的第三方类库
引入模块的方式  androidstudio---file----new----import module ----引入module即可----最后海淀add 到gradle文件
布局中就使用这个第三方的RecyclerView即可
//         头部
//         headerView = LayoutInflater.from(this).inflate(R.layout.header_view, null);
//         脚部
//         footerView = LayoutInflater.from(this).inflate(R.layout.footer_view, null);
//        添加头部和脚部,如果不添加就使用默认的头部和脚部(头部可以有多个)
//        mRecyclerView.addHeaderView(headerView);
//     设置头部的最大拉伸倍率,默认1.5f,必须写在setHeaderImage()之前
//       mRecyclerView.setScaleRatio(2.0f);
//     设置下拉时拉伸的图片,不设置就使用默认的
//     mRecyclerView.setHeaderImage((ImageView) headerView.findViewById(R.id.iv_hander));
//     mRecyclerView.addFootView(footerView);

    private void initView() {
        recyclerView = (AnimRFRecyclerView) findViewById(R.id.animRecyclerView);
        //设置布局管理器
     //    manager = new LinearLayoutManager(context);
        AnimRFLinearLayoutManager linearLayoutManager =new AnimRFLinearLayoutManager(context);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.addItemDecoration(new DividerGridItemDecoration(context));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setLoadDataListener(new AnimRFRecyclerView.LoadDataListener() {
            @Override
            public void onRefresh() {


                    curPage=1;
                    column=1;
                    loadData();
          //有个小问题 下拉刷新有bug
              recyclerView.refreshComplate();


            }

            @Override
            public void onLoadMore() {
            curPage++;

             loadData();
               recyclerView.loadMoreComplate();
            }
        });
ListView的上下拉刷新的方式:
RecyclerView的前两种方式完全试用于ListView,ListView也被大神延伸出来了第三方的类库,PullToRefreshListView
用法也同上。

上面所有引用的第三方控件或者类库在zip文件夹中都有 而且zip文件夹中还有我做的一个小小的demo展示了上下拉刷新的实现
以及RecyclerView的多布局 CardView Toolbar登控件的使用
RecyclerView多布局的关键方法是getItemViewType 返回值是每种布局的编号,有多少种布局就需要创建多少种ViewHolder的子类

然后根据不同的itemType在 RecyclerView.ViewHolder onCreateViewHolder 返回不同的viewhoder对象
再根据不同的viewholder对象在BindViewHoder类中进行对item中的每个控件进行赋值




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值