Android App使用RecyclerView实现上拉和下拉刷新的方法

关于RecyclerView

RecyclerView在Android 5.0以来被引入,以前经常使用的ListView 继承的是AbsListView,而RecyclerView则直接继承 ViewGroup,并实现了ScrollingView 和 NestedScrollingChild接口,RecyclerView相比ListView,是一次彻底的改变。
RecyclerView比listview更先进更灵活,对于很多的视图它就是一个容器,可以有效的重用和滚动。当数据动态变化的时候请使用它。
RecyclerView使用起来很方便因为它提供:
1、它为item的定位提供一个layoutmanager
2、为item的操作提供一个缺省的animations
3、还可以灵活地定义这个小部件的自定义布局管理器和动画

实现上拉刷新和下拉刷新
布局文件:

<android.support.v4.widget.SwipeRefreshLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/swipe_refresh_widget"
  android:layout_width="match_parent"
  android:layout_height="match_parent" > 

  <android.support.v7.widget.RecyclerView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cacheColorHint="@null"
    android:scrollbars="vertical" /> 

</android.support.v4.widget.SwipeRefreshLayout>

在Activity中引用这个布局并初始化

@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main); 

 mSwipeRefreshWidget = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_widget);
 mRecyclerView = (RecyclerView) findViewById(android.R.id.list); 

 mSwipeRefreshWidget.setColorScheme(R.color.color1, R.color.color2,
  R.color.color3, R.color.color4);
 mSwipeRefreshWidget.setOnRefreshListener(this); 

 // 这句话是为了,第一次进入页面的时候显示加载进度条
 mSwipeRefreshWidget.setProgressViewOffset(false, 0, (int) TypedValue
  .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources()
   .getDisplayMetrics())); 

 mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 

  @Override
  public void onScrollStateChanged(RecyclerView recyclerView,
   int newState) {
  super.onScrollStateChanged(recyclerView, newState);
  if (newState == RecyclerView.SCROLL_STATE_IDLE
   && lastVisibleItem + 1 == adapter.getItemCount()) {
   mSwipeRefreshWidget.setRefreshing(true);
   // 此处在现实项目中,请换成网络请求数据代码,sendRequest .....
   handler.sendEmptyMessageDelayed(0, 3000);
  }
  } 

  @Override
  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
  super.onScrolled(recyclerView, dx, dy);
  lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
  } 

 }); 

 mRecyclerView.setHasFixedSize(true);
 mLayoutManager = new LinearLayoutManager(this);
 mRecyclerView.setLayoutManager(mLayoutManager);
 mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 

 adapter = new SampleAdapter();
 mRecyclerView.setAdapter(adapter); 

 // 此处在现实项目中,请换成网络请求数据代码,sendRequest .....
 handler.sendEmptyMessageDelayed(0, 3000);
 }

SwipeRefreshLayout里面需要注意的Api:
1、setOnRefreshListener(OnRefreshListener listener)  设置下拉监听,当用户下拉的时候会去执行回调
2、setColorSchemeColors(int... colors) 设置 进度条的颜色变化,最多可以设置4种颜色
3、setProgressViewOffset(boolean scale, int start, int end) 调整进度条距离屏幕顶部的距离
4、setRefreshing(boolean refreshing) 设置SwipeRefreshLayout当前是否处于刷新状态,一般是在请求数据的时候设置为true,在数据被加载到View中后,设置为false。

RecyclerView的实现:

第一种,下拉刷新和上拉刷新都用SwipeRefreshLayout 自带的进度条

mRecyclerView = (RecyclerView) findViewById(android.R.id.list);
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 

  @Override
  public void onScrollStateChanged(RecyclerView recyclerView,
   int newState) {
  super.onScrollStateChanged(recyclerView, newState);
  if (newState == RecyclerView.SCROLL_STATE_IDLE
   && lastVisibleItem + 1 == adapter.getItemCount()) {
   mSwipeRefreshWidget.setRefreshing(true);
   // 此处在现实项目中,请换成网络请求数据代码,sendRequest .....
   handler.sendEmptyMessageDelayed(0, 3000);
  }
  } 

  @Override
  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
  super.onScrolled(recyclerView, dx, dy);
  lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
  }
 }); 

 mRecyclerView.setHasFixedSize(true);
 mLayoutManager = new LinearLayoutManager(this);
 mRecyclerView.setLayoutManager(mLayoutManager);
 mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 

 adapter = new SampleAdapter();
 mRecyclerView.setAdapter(adapter);

第二种实现下拉刷新用SwipeRefreshLayout 自带的进度条, 上拉刷新用类似ListView的刷新 提示“加载中”等信息。

我们可以给RecyclerView 也添加一个类似FooterView的item。
我们在Adapter中实现:

public class SampleAdapter extends RecyclerView.Adapter<ViewHolder> {
 private List<Integer> list; 

 private static final int TYPE_ITEM = 0;
 private static final int TYPE_FOOTER = 1; 

 public List<Integer> getList() {
 return list;
 } 

 public SampleAdapter() {
 list = new ArrayList<Integer>();
 } 

 // RecyclerView的count设置为数据总条数+ 1(footerView)
 @Override
 public int getItemCount() {
 return list.size() + 1;
 } 

 @Override
 public int getItemViewType(int position) {
 // 最后一个item设置为footerView
 if (position + 1 == getItemCount()) {
  return TYPE_FOOTER;
 } else {
  return TYPE_ITEM;
 }
 } 

 @Override
 public void onBindViewHolder(ViewHolder holder, final int position) {
 if (holder instanceof ItemViewHolder) {
  ((ItemViewHolder) holder).textView.setText(String.valueOf(list
   .get(position)));
 }
 } 

 @Override
 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 if (viewType == TYPE_ITEM) {
  View view = LayoutInflater.from(parent.getContext()).inflate(
   R.layout.list_item_text, null);
  view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
   LayoutParams.WRAP_CONTENT));
  return new ItemViewHolder(view);
 }
 // type == TYPE_FOOTER 返回footerView
 else if (viewType == TYPE_FOOTER) {
  View view = LayoutInflater.from(parent.getContext()).inflate(
   R.layout.footerview, null);
  view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
   LayoutParams.WRAP_CONTENT));
  return new FooterViewHolder(view);
 } 

 return null;
 } 

 class FooterViewHolder extends ViewHolder { 

 public FooterViewHolder(View view) {
  super(view);
 } 

 } 

 class ItemViewHolder extends ViewHolder {
 TextView textView; 

 public ItemViewHolder(View view) {
  super(view);
  textView = (TextView) view.findViewById(R.id.text);
 }
 }
}

这样我们就可以针对footerview的布局做一些处理了,比如提示“加载中,”,“已经全部加载”等信息。更加灵活一点

(0)

相关推荐

  • Android RecyclerView下拉刷新和上拉加载更多

    今天终于有点时间,来写了一下: 为RecyclerView实现下拉刷新和上拉加载更多.今天会在前面的两篇文章的基础上: RecyclerView系列之(1):为RecyclerView添加Header和Footer RecyclerView系列之(2):为RecyclerView添加分隔线 继续讲述RecyclerView中一些常用组件的实现下拉刷新和上拉加载更多的功能. 在现在的Android手机应用中,几乎每一个APP都有下拉刷新和上拉加载更多的功能,它们的重要性不言而喻. 先不多说,先看效

  • android RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载

    本文介绍的库中的侧滑效果借鉴自SwipeMenu,并对SipwMenu的源码做了修改与Bug修复,然后才开发出的SwipeRecyclerView. 需要说明的是,本库没有对RecyclerView做大的修改,只是ItemView的封装.看起来是对RecyclerView的修改,其实仅仅是为RecyclerView添加了使用的方法API而已. 本库已经更新了三个版本了,会一直维护下去,根据小伙伴的要求,以后也会添加一些其它功能. SwipeRecyclerView将完美解决这些问题: 以下功能全

  • Android RecyclerView实现下拉刷新和上拉加载

    RecyclerView已经出来很久了,许许多多的项目都开始从ListView转战RecyclerView,那么,上拉加载和下拉刷新是一件很有必要的事情. 在ListView上,我们可以通过自己添加addHeadView和addFootView去添加头布局和底部局实现自定义的上拉和下拉,或者使用一些第三方库来简单的集成,例如Android-pulltorefresh或者android-Ultra-Pull-to-Refresh,后者的自定义更强,但需要自己实现上拉加载. 而在下面我们将用两种方式

  • Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法

    RecyclerView 已经出来很久了,但是在项目中之前都使用的是ListView,最近新的项目上了都大量的使用了RecycleView.尤其是瀑布流的下拉刷新,网上吧啦吧啦没有合适的自己总结了一哈. 先贴图上来看看: 使用RecyclerView实现上拉加载更多和下拉刷新的功能我自己有两种方式: 1.使用系统自带的Android.support.v4.widget.SwipeRefreshLayout这个控价来实现. 2.自定义的里面带有RecyleView的控件. 使用RecycleVie

  • Android仿XListView支持下拉刷新和上划加载更多的自定义RecyclerView

    首先给大家展示下效果图,感觉还不错,请继续往下阅读: 下拉刷新:        上划加载        在项目更新的过程中,遇到了一个将XListView换成recyclerView的需求,而且更换完之后大体效果不能变,但是对于下拉刷新这样的效果,谷歌给出的解决方案是把RecyclerView放在一个SwipeRefreshLayout中,但是这样其实是拉下一个小圆形控件实现的,和XListView的header效果不同.在网上找了很多的别人代码,都没有实现我想要的效果,于是自己动手写了一个.

  • Android中使用RecyclerView实现下拉刷新和上拉加载

    推荐阅读:使用RecyclerView添加Header和Footer的方法                       RecyclerView的使用之HelloWorld RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.本文给大家介绍如何为RecyclerView添加下拉刷新和上拉加载,过去在ListView当中添加下拉刷新和上拉加载是非常方便的利用addHeaderView和addFooterVie

  • Android实现RecyclerView下拉刷新效果

    本文为大家分享了Android实现RecyclerView下拉刷新效果的具体代码,供大家参考,具体内容如下 思路 RealPullRefreshView继承了一个LinearLayout 里面放置了一个刷新头布局,将其margin_top设置为负的刷新头的高度的 再添加一个RecyclerView 触摸事件分发机制,当在特定条件下让RealPullRefreshView拦截触摸事件,否则的话,不拦截,让RecyclerView自己去处理触摸事件 在手指下拉时,定义好不同的状态STATE,在不同状

  • Android RecyclerView实现下拉刷新和上拉加载更多

    使用官方的刷新控件SwipeRefreshLayout来实现下拉刷新,当RecyclerView滑到底部实现下拉加载(进度条效果用RecyclerView加载一个布局实现) 需要完成控件的下拉监听和上拉监听,其中,下拉监听通过SwipRefreshLayout的setOnRefreshListener()方法监听,而上拉刷新,需要通过监听列表的滚动,当列表滚动到底部时触发事件,具体代码如下 主布局 <?xml version="1.0" encoding="utf-8&

  • Android使用recyclerview打造真正的下拉刷新上拉加载效果

    前言 前段时间需要用到recyclerview,就想找个封装好的下拉刷新,上拉加载的库,结果愣是没找到,便自己写了一个. 注意:我说的是"上拉加载",不是滑到底部自动加载. 虽然现在自动加载是主流和趋势,但也不排除有时候就需要用到上拉加载啊,毕竟林子大了,什么样的产品经理都有对吧. 代码写好后,准备发布到bintray的时候,向同事征求这个项目的名字,同事说:"就叫DZTRecyclerview!" 不解,同事解释:"叼炸天Recyclerview!&qu

  • Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新

    Android使用RecyclerView 1. 什么是RecyclerView RecyclerView 是 Android-support-v7-21 版本中新增的一个 Widgets,官方对于它的介绍则是:RecyclerView 是 ListView 的升级版本,更加先进和灵活. 简单来说就是:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式.它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持. 2.

随机推荐