listview下拉刷新上拉加载扩展(一) http://blog.csdn.net/baiyuliang2013/article/details/50252561

listview下拉刷新上拉加载扩展(二)-仿美团外卖 http://blog.csdn.net/baiyuliang2013/article/details/50253135

listview下拉刷新上拉加载扩展(三)-仿最新版美团外卖 http://blog.csdn.net/baiyuliang2013/article/details/50854592

前几篇文章讲过listview的自定义下拉刷新上拉加载,最近一直考虑再来个RecyclerView的下拉刷新和上拉加载,毕竟RecyclerView使用的越来越多了,扒了扒网上有关RecyclerView下拉刷新上拉加载的也有很多,不过大多数都满足不了像listview上的那种刷新效果!为此,博主也是煞费苦心地思考了两天,到底该怎样做,才能让RecyclerView的下拉刷新上拉加载像listview一样666呢?

我们知道,listview自带有addHeaderView和addFooterView,很随意的添加头尾布局,而且在重写listview时监听本身即可,但遗憾的是,RecyclerView并不像listview那样方便的添加头尾布局,所以问题就来了,想实现RecyclerView的下拉刷新和上拉加载必然要解决的一件事就是,如何随意的给RecyclerView添加头尾布局?

有的同学可能会说,RecyclerView通过适配器中的viewType添加header和footer不是很好办的事情吗?是的,抛开刷新不说,RecyclerView添加头尾布局确实方便,但这个违背了自定义View的初衷,我们要的是像listview一样重写RecyclerView,而不需要任何其它条件,拿来即用,所以这个方法不可行!那还有什么方法呢,博主思来想去,也就通过重写线性布局LinearLayout,来顺序添加headerview,RecyclerView,footerview最适合不过了,然后监听LinearLayout的触摸事件可达到效果!

好了,思路确定后,开始实现吧!

*重写LinearLayout,并在构造方法中,inflate出headerview,RecyclerView,footerview,并依次添加!(步骤跟前几篇的listview刷新相似);

*监听触摸事件,结合上几篇listview的处理方法,监听OnTouch,不过悲催的是,博主忘记了一点,现在重写的是LinearLayout即一个ViewGroup,RecyclerView只是LinearLayout的一个子View,下拉时的效果还凑合,但是不松手再上滑时就悲催了,因为RecyclerView跟headerview和footerview并不像listview那样是一体的,所以效果可想而知了,因此只监听onTouch当然是不行的!

好吧,那现在我们还得把一把事件分发机制了。。。(事件分发机制,博主也不会细讲,因为博主在迷迷糊糊的呢。万一讲错了,你们削我咋弄?),上一张触摸事件传递图吧:

对事件分发机制有点经验的应该很容易看懂了,结合我们的项目,那么在触摸RecyclerView的事件传递就是:

触摸RecyclerView:
->LinearLayout的dispatchTouchEvent
->LinearLayout的onInterceptTouchEvent
->RecyclerView的dispatchTouchEvent
->RecyclerView的onTouchEvent
->LinearLayout的onTouchEvent

关于事件分发机制不懂得同学可以自行百度了,注意一点,最小View是没有onInterceptTouchEvent拦截事件的!

好了,事件分发弄通了,往下进行呗!但俗话说的好,不要重复发明轮子,呵呵,所以博主也参考了开源的pulltorefresh中的部分代码(当然,大家在使用轮子的时候一定要搞懂原理,达到举一反三地效果,切不可奉行糊里糊涂的拿来主义),结合本项目中的RecyclerView完成了像listview那般的下拉刷新和上拉加载!

看下实现效果吧:

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <com.byl.recyclerview.view.PullRecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"/>

</RelativeLayout>

实现代码:

   recyclerView = (PullRecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setOnHeaderRefreshListener(this);
        recyclerView.setOnFooterRefreshListener(this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        myAdapter = new MyAdapter();
        recyclerView.setAdapter(myAdapter);

本例中没有设置禁止下拉上拉的方法,大家可根据需要自行设置一个方法,在触摸事件中判断即可!当item数量不满一屏时可以禁止上拉加载!

ASdemo下载地址:http://download.csdn.net/detail/baiyuliang2013/9531776

RecyclerView下拉刷新上拉加载(一)的更多相关文章

  1. Android 下拉刷新上啦加载SmartRefreshLayout + RecyclerView

    在弄android刷新的时候,可算是耗费了一番功夫,最后发觉有现成的控件,并且非常好用,这里记录一下. 原文是 https://blog.csdn.net/huangxin112/article/de ...

  2. SwipeRefreshLayout实现下拉刷新上滑加载

    1. 效果图 2.RefreshLayout.java package myapplication.com.myapplication; import android.content.Context; ...

  3. 移动端下拉刷新上拉加载-mescroll.js插件

    最近无意间看到有这么一个上拉刷新下拉加载的插件 -- mescroll.js,个人感觉挺好用的,官网地址是:http://www.mescroll.com 然后我就看了一下文档,简单的写了一个小dem ...

  4. 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载

    title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...

  5. RecyclerView下拉刷新上拉加载(三)—对Adapter的封装

    RecyclerView下拉刷新上拉加载(一) http://blog.csdn.net/baiyuliang2013/article/details/51506036 RecyclerView下拉刷 ...

  6. RecyclerView下拉刷新上拉加载(二)

    listview下拉刷新上拉加载扩展(一) http://blog.csdn.net/baiyuliang2013/article/details/50252561 listview下拉刷新上拉加载扩 ...

  7. MaterialRefreshLayout+ListView 下拉刷新 上拉加载

    效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行. 下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种 ...

  8. 自定义ListView下拉刷新上拉加载更多

    自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多 Listview现在用的很少了,基本都是使用Recycleview,但是不得不说Listview具有划时 ...

  9. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多

    ListView实现Item上下拖动交换位置  并且实现下拉刷新  上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...

随机推荐

  1. hdu 5607 BestCoder Round #68 (矩阵快速幂)

    graph  Accepts: 9 Submissions: 61  Time Limit: 8000/4000 MS (Java/Others)  Memory Limit: 65536/65536 ...

  2. bzoj2560串珠子 状压dp+容斥(?)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 515  Solved: 348[Submit][Status][Discuss] ...

  3. Linux下运行当前目录需要加./的原因

    在Windows下运行当前目录的文件,可以直接输入文件全名,就能够运行该文件.但对于Linux则必须加上./文件名才能运行.对于这一点表示很疑惑,最后查阅了资料才弄明白. 原因如下: 1.在Windo ...

  4. Python作业之三次登陆锁定用户

    作业之三次登陆锁定用户 作业要求如下: 1. 输入用户名和密码 2. 认证成功提示欢迎信息 3. 认证失败三次锁定用户 具体代码如下: 方法1: import os#导入os模块 if os.path ...

  5. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  6. java如何获得数据库表中各字段的字段名

    public class TestDemo { public static Connection getConnection() { Connection conn = null; try { Cla ...

  7. LintCode题解之比较字符串

    使用标记的方式,先遍历一遍B,出现一次就记录一次出现次数,然后遍历A,将记录的B的出现次数消去,最后检查一下记录的标记位是不是都消去了,总共需要检查三次,即进行三次O(n)的遍历. 然后总结出规律如果 ...

  8. mysql substr() 函数

    mysql substr() 函数 用法:substr(string string,num start,num length); string为字符串:start为起始位置:length为长度. 注意 ...

  9. PHP 实例 AJAX RSS 阅读器

    RSS 是一种描述和同步网站内容的格式,是目前使用最广泛的XML应用. RSS 搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者. RSS 阅读器用于阅读 RSS Feed. AJA ...

  10. Docker Hub

    目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了超过 15,000 的镜像.大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现. 登录 可以通过执行 ...