下拉刷新和上拉刷新都用SwipeRefreshLayout 自带的进度条

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.liu.swiperefreshlayoutrecyclerviewdemo.MainActivity"><android.support.v4.widget.SwipeRefreshLayoutandroid:id="@+id/swipeRefreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></android.support.v4.widget.SwipeRefreshLayout></LinearLayout>

item布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:layout_margin="5dp"android:layout_width="match_parent"android:layout_height="wrap_content"><android.support.v7.widget.CardViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="5dp"app:cardCornerRadius="10dp"android:elevation="10dp"><TextViewandroid:layout_margin="10dp"android:textSize="18sp"android:id="@+id/tvContent"android:text="魂牵梦萦地"android:layout_width="match_parent"android:layout_height="wrap_content"/></android.support.v7.widget.CardView></LinearLayout>

Adapter

package com.liu.swiperefreshlayoutrecyclerviewdemo.adapter;import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;import com.liu.swiperefreshlayoutrecyclerviewdemo.R;import java.util.List;import butterknife.BindView;
import butterknife.ButterKnife;/*** Created by 刘楠 on 2016/9/10 0010.18:06*/
public class RefreshAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {Context        mContext;LayoutInflater mInflater;List<String>   mDatas;public RefreshAdapter(Context context, List<String> datas) {mContext = context;mInflater = LayoutInflater.from(context);mDatas = datas;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View itemView = mInflater.inflate(R.layout.item_refresh_recylerview, parent, false);return new ItemViewHolder(itemView);}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if(holder instanceof ItemViewHolder){ItemViewHolder itemViewHolder = (ItemViewHolder) holder;String str = mDatas.get(position);itemViewHolder.mTvContent.setText(str);}}@Overridepublic int getItemCount() {return mDatas.size();}@Overridepublic int getItemViewType(int position) {return super.getItemViewType(position);}public class ItemViewHolder extends RecyclerView.ViewHolder {@BindView(R.id.tvContent)TextView mTvContent;public ItemViewHolder(View itemView) {super(itemView);ButterKnife.bind(this,itemView);initListener(itemView);}private void initListener(View itemView) {itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext, "poistion "+ getAdapterPosition(), Toast.LENGTH_SHORT).show();}});}}public void AddHeaderItem(List<String> items){mDatas.addAll(0,items);notifyDataSetChanged();}public void AddFooterItem(List<String> items){mDatas.addAll(items);notifyDataSetChanged();}
}

Activity

package com.liu.swiperefreshlayoutrecyclerviewdemo;import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Window;
import android.widget.Toast;import com.liu.swiperefreshlayoutrecyclerviewdemo.adapter.RefreshAdapter;import java.util.ArrayList;
import java.util.List;import butterknife.BindView;
import butterknife.ButterKnife;public class MainActivity extends AppCompatActivity {@BindView(R.id.recyclerView)RecyclerView       mRecyclerView;@BindView(R.id.swipeRefreshLayout)SwipeRefreshLayout mSwipeRefreshLayout;List<String> mDatas = new ArrayList<>();private RefreshAdapter mRefreshAdapter;private LinearLayoutManager mLinearLayoutManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);ButterKnife.bind(this);initView();initData();initListener();}private void initView() {mSwipeRefreshLayout.setColorSchemeColors(Color.RED,Color.BLUE,Color.GREEN);}private void initData() {for (int i = 0; i < 10; i++) {mDatas.add(" Item "+i);}initRecylerView();}private void initRecylerView() {mRefreshAdapter = new RefreshAdapter(this,mDatas);mLinearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);mRecyclerView.setLayoutManager(mLinearLayoutManager);mRecyclerView.setAdapter(mRefreshAdapter);}private void initListener() {initPullRefresh();initLoadMoreListener();}private void initPullRefresh() {mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {new Handler().postDelayed(new Runnable() {@Overridepublic void run() {List<String> headDatas = new ArrayList<String>();for (int i = 20; i <30 ; i++) {headDatas.add("Heard Item "+i);}mRefreshAdapter.AddHeaderItem(headDatas);//刷新完成mSwipeRefreshLayout.setRefreshing(false);Toast.makeText(MainActivity.this, "更新了 "+headDatas.size()+" 条目数据", Toast.LENGTH_SHORT).show();}}, 3000);}});}private void initLoadMoreListener() {mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {int lastVisibleItem ;@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);//判断RecyclerView的状态 是空闲时,同时,是最后一个可见的ITEM时才加载if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==mRefreshAdapter.getItemCount()){new Handler().postDelayed(new Runnable() {@Overridepublic void run() {List<String> footerDatas = new ArrayList<String>();for (int i = 0; i< 10; i++) {footerDatas.add("footer  item" + i);}mRefreshAdapter.AddFooterItem(footerDatas);Toast.makeText(MainActivity.this, "更新了 "+footerDatas.size()+" 条目数据", Toast.LENGTH_SHORT).show();}}, 3000);}}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();//最后一个可见的ITEMlastVisibleItem=layoutManager.findLastVisibleItemPosition();}});}
}

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

load_more 布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/loadLayout"android:padding="10dp"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="5dip"android:layout_marginTop="5dip"android:gravity="center"><ProgressBarandroid:id="@+id/pbLoad"android:layout_width="20dp"android:layout_height="20dp"android:layout_centerVertical="true"android:indeterminate="false"/><TextViewandroid:id="@+id/tvLoadText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_centerVertical="true"android:layout_marginLeft="4dip"android:layout_toRightOf="@id/pbLoad"android:clickable="true"android:text="魂牵梦萦 魂牵梦萦 "android:textColor="#000000"android:textSize="16sp"/></RelativeLayout></LinearLayout>

Adapter

package com.liu.swiperefreshlayoutrecyclerviewdemo.adapter;import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;import com.liu.swiperefreshlayoutrecyclerviewdemo.R;import java.util.List;import butterknife.BindView;
import butterknife.ButterKnife;/*** Created by 刘楠 on 2016/9/10 0010.18:06*/
public class RefreshAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {Context        mContext;LayoutInflater mInflater;List<String>   mDatas;private static final int TYPE_ITEM   = 0;private static final int TYPE_FOOTER = 1;//上拉加载更多public static final int PULLUP_LOAD_MORE = 0;//正在加载中public static final int LOADING_MORE     = 1;//没有加载更多 隐藏public static final int NO_LOAD_MORE     = 2;//上拉加载更多状态-默认为0private int mLoadMoreStatus = 0;public RefreshAdapter(Context context, List<String> datas) {mContext = context;mInflater = LayoutInflater.from(context);mDatas = datas;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (viewType == TYPE_ITEM) {View itemView = mInflater.inflate(R.layout.item_refresh_recylerview, parent, false);return new ItemViewHolder(itemView);} else if (viewType == TYPE_FOOTER) {View itemView = mInflater.inflate(R.layout.load_more_footview_layout, parent, false);return new FooterViewHolder(itemView);}return null;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if (holder instanceof ItemViewHolder) {ItemViewHolder itemViewHolder = (ItemViewHolder) holder;String         str            = mDatas.get(position);itemViewHolder.mTvContent.setText(str);} else if (holder instanceof FooterViewHolder) {FooterViewHolder footerViewHolder = (FooterViewHolder) holder;switch (mLoadMoreStatus) {case PULLUP_LOAD_MORE:footerViewHolder.mTvLoadText.setText("上拉加载更多...");break;case LOADING_MORE:footerViewHolder.mTvLoadText.setText("正加载更多...");break;case NO_LOAD_MORE://隐藏加载更多
                    footerViewHolder.mLoadLayout.setVisibility(View.GONE);break;}}}@Overridepublic int getItemCount() {//RecyclerView的count设置为数据总条数+ 1(footerView)return mDatas.size() + 1;}@Overridepublic int getItemViewType(int position) {if (position + 1 == getItemCount()) {//最后一个item设置为footerViewreturn TYPE_FOOTER;} else {return TYPE_ITEM;}}public class ItemViewHolder extends RecyclerView.ViewHolder {@BindView(R.id.tvContent)TextView mTvContent;public ItemViewHolder(View itemView) {super(itemView);ButterKnife.bind(this, itemView);initListener(itemView);}private void initListener(View itemView) {itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext, "poistion " + getAdapterPosition(), Toast.LENGTH_SHORT).show();}});}}public class FooterViewHolder extends RecyclerView.ViewHolder {@BindView(R.id.pbLoad)ProgressBar  mPbLoad;@BindView(R.id.tvLoadText)TextView     mTvLoadText;@BindView(R.id.loadLayout)LinearLayout mLoadLayout;public FooterViewHolder(View itemView) {super(itemView);ButterKnife.bind(this,itemView);}}public void AddHeaderItem(List<String> items) {mDatas.addAll(0, items);notifyDataSetChanged();}public void AddFooterItem(List<String> items) {mDatas.addAll(items);notifyDataSetChanged();}/*** 更新加载更多状态* @param status*/public void changeMoreStatus(int status){mLoadMoreStatus=status;notifyDataSetChanged();}
}

Activity

变更加载更多方法

  private void initLoadMoreListener() {mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {int lastVisibleItem ;@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);//判断RecyclerView的状态 是空闲时,同时,是最后一个可见的ITEM时才加载if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==mRefreshAdapter.getItemCount()){//设置正在加载更多
                    mRefreshAdapter.changeMoreStatus(mRefreshAdapter.LOADING_MORE);new Handler().postDelayed(new Runnable() {@Overridepublic void run() {List<String> footerDatas = new ArrayList<String>();for (int i = 0; i< 10; i++) {footerDatas.add("footer  item" + i);}mRefreshAdapter.AddFooterItem(footerDatas);//设置回到上拉加载更多
                            mRefreshAdapter.changeMoreStatus(mRefreshAdapter.PULLUP_LOAD_MORE);Toast.makeText(MainActivity.this, "更新了 "+footerDatas.size()+" 条目数据", Toast.LENGTH_SHORT).show();}}, 3000);}}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();//最后一个可见的ITEMlastVisibleItem=layoutManager.findLastVisibleItemPosition();}});}

源码:

https://github.com/ln0491/SwipeRefreshLayoutRecyclerViewDemo

SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新相关推荐

  1. 教你如何使用SwipeRefreshLayout来构建一个上拉加载下拉刷新框架

    前言: 基本上所以的移动端应用都有Listview(当然RecyclerView也一样),那必不可少的都会嵌入一个上拉加载下拉刷新的功能.这样能大大的减少用户的流量消耗,同样对于用户也有更好的用户体验 ...

  2. 开发者头条(五):实现recyclerview的上拉加载 + 下拉刷新

    学习Ansen的博客,原文:带你实现开发者头条APP(五)–RecyclerView下拉刷新上拉加载 ,这一篇写的很详细. 知识点 今天主要是实现recyclerview的上拉加载跟多和下拉刷新,依赖 ...

  3. Android 智能上拉加载下拉刷新框架之SmartRefreshLayout

    1.说明: SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷新框架,并集成各种的炫酷.多样.实用.美观的Header和Footer.它不只是支持所有的View,还支持多层嵌 ...

  4. php微信小程序向下滑动,微信小程序功能实现:上滑加载下拉刷新

    本篇文章给大家带来的内容是关于微信小程序功能实现:上滑加载下拉刷新,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 之前谈到文章列表的数据加载,是一次性全部加载,这样是不友好的.这章介 ...

  5. ionic上拉加载-下拉刷新

    ionic上拉加载-下拉刷新 1.上拉加载 <ion-infinite-scroll on-infinite="loadOlderStories()" distance=&q ...

  6. Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法...

    bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore ...

  7. Android PullToRefreshListView上拉刷新和下拉刷新

    PullToRefreshListView实现上拉和下拉刷新有两个步骤: 1.设置刷新方式 pullToRefreshView.setMode(PullToRefreshBase.Mode.BOTH) ...

  8. php mescroll,mescroll.js上拉加载下拉刷新组件使用详解

    本文实例为大家分享了上拉加载下拉刷新组件mescroll.js的具体代码,供大家参考,具体内容如下 使用注意事项: 1.引入的时候出问题及时看官方给出的解决方案(基本上都必须看): 2.react中一 ...

  9. uniapp实现上拉刷新,下拉加载

    上拉刷新,下拉加载这个功能实际上在我们的应用当中使用范围是很广的,比如说商城中心在展示商品的时候就可以使用下拉加载这样的功能,那么如何实现呢? 首先遇到这个功能我就去搜插件市场了.经过我下载了不少的插 ...

  10. ios 上拉加载 下拉刷新

    在一款 App应用中有的时候会用到上拉加载下拉刷新的功能,本人觉得SVPullToRefresh很好用(可以用在UIScrollView上,包括UITableview和UICollectionView ...

最新文章

  1. moveTaskToback退后台
  2. 如何避免fstab挂载故障问题
  3. django+celery+rabitmq
  4. idea 自动生成mybaits_怎么让idea自动创建mybatis配置文件
  5. Angular 4.x 自定义验证指令
  6. 生物科技PSD分层海报模板|细胞光效微观,满满渗透感
  7. AFTER触发器与INSTEAD OF触发器的区别
  8. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--数码管电路驱动(八)
  9. Bootstraptable源码
  10. 使用SQL语句添加和删除约束
  11. 微服务模式下API测试
  12. st8s003 c语言编译器,ST系列STM8S003F3P6单片机芯片介绍
  13. java实现冒泡算法
  14. unity NGUI图文混排
  15. echart曲线图的使用
  16. HTML5期末大作业:美食网站设计——餐饮美食-咖啡(5页) HTML5网页设计成品_学生DW静态食品网页设计_web课程设计网页制作
  17. 品读 泰戈尔 飞鸟集 之六 伤往昔
  18. 【Windows7】win7启动 报错 AutoIt错误,不能打开脚本文件
  19. Photoshop 7.0使用教程
  20. 怎么查快递到哪里了?快递单号查询全部物流

热门文章

  1. L1-029. 是不是太胖了-PAT团体程序设计天梯赛GPLT
  2. java方法被编译器调用_我异常了,快来捕获我,Java异常简述
  3. flutter 返回指定界面_Flutter 即学即用系列博客——04 Flutter UI 初窥
  4. 用python写helloworld_使用python写一个Hello World
  5. yum升级CURL到最新版本的方法,非常好用
  6. 《软件需求》学习笔记
  7. 借助阿里AntUI元素实现两个Web页面之间的过渡——“Loading…”
  8. github 使用之--ssh配置(及解决ssh_add 报错)
  9. php控制台输入输出
  10. 关于IronPython