RecyclerView下拉刷新上拉加载(一)
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下拉刷新上拉加载(一)的更多相关文章
- Android 下拉刷新上啦加载SmartRefreshLayout + RecyclerView
在弄android刷新的时候,可算是耗费了一番功夫,最后发觉有现成的控件,并且非常好用,这里记录一下. 原文是 https://blog.csdn.net/huangxin112/article/de ...
- SwipeRefreshLayout实现下拉刷新上滑加载
1. 效果图 2.RefreshLayout.java package myapplication.com.myapplication; import android.content.Context; ...
- 移动端下拉刷新上拉加载-mescroll.js插件
最近无意间看到有这么一个上拉刷新下拉加载的插件 -- mescroll.js,个人感觉挺好用的,官网地址是:http://www.mescroll.com 然后我就看了一下文档,简单的写了一个小dem ...
- 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载
title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...
- RecyclerView下拉刷新上拉加载(三)—对Adapter的封装
RecyclerView下拉刷新上拉加载(一) http://blog.csdn.net/baiyuliang2013/article/details/51506036 RecyclerView下拉刷 ...
- RecyclerView下拉刷新上拉加载(二)
listview下拉刷新上拉加载扩展(一) http://blog.csdn.net/baiyuliang2013/article/details/50252561 listview下拉刷新上拉加载扩 ...
- MaterialRefreshLayout+ListView 下拉刷新 上拉加载
效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行. 下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种 ...
- 自定义ListView下拉刷新上拉加载更多
自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多 Listview现在用的很少了,基本都是使用Recycleview,但是不得不说Listview具有划时 ...
- ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多
ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...
随机推荐
- 习题 7-2 uva225(回溯)
题意:从(0.0)点出发,第一次走一步……第k次走k步,且每次必须转90度,不能走重复的点.求k次后回到出发点的所有情况.按最小字典序从小到大输出. 思路: 把所有坐标+220,保证其是正数,然后搜索 ...
- poj 1367 robot(搜索)
题意:给你一个图,求起点 到 终点的最少时间 每次有两种选择①:往前走1~3步 ②原地选择90° 费时皆是1s 图中1为障碍物,而且不能出边界.还要考虑机器人的直径 ...
- 计科1702冯亚杰C语言程序设计预备作业
阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 答:首先老师和学生之间要互相尊重,我认为这是必要的.在第一点的基础上师生要互相帮助,互相配合,共同进步 ...
- rasa_core:基于机器学习的对话引擎
用机器学习管理你的对话,让它提升每一个对话.Rasa Core引导对话,考虑对话的历史和外部环境. 而不是成千上万的规则,Rasa 从真正的对话中挑选模式. 现在是扔掉你的状态机的时候了! Manag ...
- bzip2
压缩和解压缩文件bzip2 options] [file-list] bunzip2 [options] [file-list] bzcat [options] [file-list] bzip2re ...
- sql统计总和和各状态数
统计状态数目 SELECT arch.dept_id ,dept.dept_name,COUNT(*) AS arch_sum, END) in_stock, END) on_loan, END) i ...
- form submit提交
form内控件参数自动添加到url后,而自定义的url参数则不能添加到url后 $('#fm').form('submit', { url: 'Data/Diary.ashx?dt=' + new D ...
- Oracle中查询和删除相同记录的3种方法
--创建测试表 )); ,'); ,'); ,'); ,'); ,'); ,'); commit; select * from test; --查询相同记录 ); select id,name fro ...
- merge into的用法及10g新特性总结
merge into 的作用: 将源数据(来源于实际的表,视图,子查询)更新或插入到指定的表中(必须实际存在),依赖于on条件,好处是避免了多个insert 和update操作. merge是一个目标 ...
- python笔记九(迭代)
一.迭代 通过for循环来遍历一个列表,我们称这种遍历的方式为迭代.只要是可迭代对象都可以进行迭代操作. 以下代码可以用来判断一个对象是否是可迭代的. 一类是集合数据类型,如list.tuple.di ...