RecyclerView下拉刷新上拉加载(一)

来源:互联网 发布:无法通过udp端口0通讯 编辑:程序博客网 时间:2024/06/06 02:41

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

3 0
原创粉丝点击