转载请标注转载:http://blog.csdn.net/oqihaogongyuan/article/details/50949118

google官方的下拉刷新+自定义上拉加载更多

现在很多app都是使用的自定义的下拉刷新上拉加载更多,然而google官方为我们提供了下拉刷新操作,我在之前的博客中有撰文针对

自定义下拉刷新操作并提供源码下载 传送门    自定义下拉刷新及上拉加载更多

google官方的下拉刷新 传送门       google官方的下拉刷新组件的详细介绍及示例下载

google官方为我们提供了下拉刷新,我们自己增加自定义的上拉加载更多,这样相互结合使用,就出现了一款新的下拉刷新和上拉加载更多的组件,非常推荐在app中增加这中效果。先来看看效果如何,如下gif图,是不是给人耳目一新的感觉呢,最下面提供示例代码供下载学习。

1、自定义listView,因为google为我们提供能下拉刷新的组件

  1. android.support.v4.widget.SwipeRefreshLayout

因此我们只需要为自定的listView添加上拉“ 加载更多 ”的功能。

自定义上拉加载更多的listView代码如下:

  1. package com.example.myfirst.pulltorefreshlist;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.view.View;
  5. import android.widget.AbsListView;
  6. import android.widget.ListView;
  7. /**
  8. * 上拉加载更多的listView,配合Google官方的下拉刷新使用
  9. * Created by chengguo on 2016/3/21.
  10. */
  11. public class LoadMoreListView extends ListView implements AbsListView.OnScrollListener {
  12. private static final String TAG = "RefreshListView";
  13. /**
  14. * 底部加载更多部分
  15. */
  16. private boolean isScrollToBottom;//判断是不是滑到了底部
  17. private View footerView; //底部的footer   view
  18. private int footerViewHeight; //底部view的高度
  19. private boolean isLoadingMore = false; //判断是不是"加载更多"
  20. /**
  21. * listview的接口,监听listview的下来刷新和上拉加载更多
  22. */
  23. private OnRefreshListener mOnRefreshListener;
  24. public LoadMoreListView(Context context) {
  25. super(context);
  26. }
  27. public LoadMoreListView(Context context, AttributeSet attrs) {
  28. super(context, attrs);
  29. initFooterView();
  30. this.setOnScrollListener(this);
  31. }
  32. /**
  33. * 初始化底部view
  34. */
  35. private void initFooterView() {
  36. footerView = View.inflate(getContext(), R.layout.footer_layout, null);
  37. //设置(0,0)以便系统测量footerView的宽高
  38. footerView.measure(0, 0);
  39. footerViewHeight = footerView.getMeasuredHeight();
  40. footerView.setPadding(0, -footerViewHeight, 0, 0);
  41. this.addFooterView(footerView);
  42. }
  43. /**
  44. * 监听listview滚动的状态变化,如果滑到了底部,就“加载更多..."
  45. */
  46. @Override
  47. public void onScrollStateChanged(AbsListView view, int scrollState) {
  48. if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_FLING) {
  49. if (isScrollToBottom && !isLoadingMore) {
  50. isLoadingMore = true;
  51. footerView.setPadding(0, 0, 0, 0);
  52. this.setSelection(this.getCount());
  53. if (mOnRefreshListener != null) {
  54. mOnRefreshListener.onLoadingMore();
  55. }
  56. }
  57. }
  58. }
  59. /**
  60. * 监听listview滚动的状态变化,判断当前是不是滑到了底部
  61. *
  62. * @param view
  63. * @param firstVisibleItem
  64. * @param visibleItemCount
  65. * @param totalItemCount
  66. */
  67. @Override
  68. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  69. if (getLastVisiblePosition() == (totalItemCount - 1)) {
  70. isScrollToBottom = true;
  71. } else {
  72. isScrollToBottom = false;
  73. }
  74. }
  75. /**
  76. * 设置监听接口,当为
  77. *
  78. * @param listener
  79. */
  80. public void setOnRefreshListener(OnRefreshListener listener) {
  81. mOnRefreshListener = listener;
  82. }
  83. /**
  84. * 为外界提供的方法,当Activity中的加载更多数据加载完后,就调用这个方法来隐藏底部的footerView
  85. */
  86. public void loadMoreComplete() {
  87. footerView.setPadding(0, -footerViewHeight, 0, 0);
  88. isLoadingMore = false;
  89. }
  90. /**
  91. * 设置接口,供外界实现,监听listview的刷新和加载更多的状态
  92. */
  93. public interface OnRefreshListener {
  94. /**
  95. * 上拉加载更多
  96. */
  97. void onLoadingMore();
  98. }
  99. }

2、activity的layout.xml文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <android.support.v4.widget.SwipeRefreshLayout
  7. android:id="@+id/swipe_google_and_loadmore_refresh_layout"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent">
  10. <com.example.myfirst.pulltorefreshlist.LoadMoreListView
  11. android:id="@+id/google_and_loadmore_refresh_listview"
  12. android:layout_width="match_parent"
  13. android:layout_height="match_parent">
  14. </com.example.myfirst.pulltorefreshlist.LoadMoreListView>
  15. </android.support.v4.widget.SwipeRefreshLayout>
  16. </LinearLayout>

3、主activity的代码如下,也有非常详细的代码注释,非常简单,这样一款google下拉刷新+自定义上拉加载更多就诞生了。

  1. package com.example.myfirst.pulltorefreshlist;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.support.v4.widget.SwipeRefreshLayout;
  6. import java.util.ArrayList;
  7. /**
  8. * google下拉刷新和自定义上拉加载更多的activity
  9. * Created by chengguo on 2016/3/21.
  10. */
  11. public class GoogleAndLoadMoreActivity extends Activity implements SwipeRefreshLayout.OnRefreshListener, LoadMoreListView.OnRefreshListener {
  12. private SwipeRefreshLayout swipeRefreshLayout;
  13. private LoadMoreListView loadMoreListView;
  14. //对象数据集合
  15. private ArrayList<ListViewItem> items;
  16. //listview的数据加载器adapter
  17. private RefreshListAdapter adapter;
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.google_and_loadmor_refreshing_aty);
  22. initView();
  23. initEvent();
  24. initData();
  25. }
  26. /**
  27. * 初始化列表数据
  28. */
  29. private void initData() {
  30. items = new ArrayList<ListViewItem>();
  31. //这里只是模拟10个列表项数据,在现实开发中,listview中的数据都是从服务器获取的。
  32. for (int i = 0; i < 10; i++) {
  33. ListViewItem item = new ListViewItem();
  34. item.setUserImg(R.mipmap.ic_launcher);
  35. item.setUserName("seven" + i);
  36. item.setUserComment("这是google官方一个下拉刷新ListView+自定义ListView上拉加载跟多");
  37. items.add(item);
  38. }
  39. //为listview配置adapter
  40. adapter = new RefreshListAdapter(GoogleAndLoadMoreActivity.this, items);
  41. loadMoreListView.setAdapter(adapter);
  42. }
  43. /**
  44. * 给控件添加事件
  45. */
  46. private void initEvent() {
  47. swipeRefreshLayout.setOnRefreshListener(this);
  48. //设置圆圈进度条的背景颜色
  49. //        swipeRefreshLayout.setProgressBackgroundColorSchemeColor(
  50. //                getResources().getColor(R.color.colorPrimary));
  51. //设置进度条变化的颜色
  52. swipeRefreshLayout.setColorSchemeResources(
  53. R.color.firstColor,
  54. R.color.secondColor,
  55. R.color.thirdColor,
  56. R.color.forthColor);
  57. }
  58. /**
  59. * 初始化界面控件
  60. */
  61. private void initView() {
  62. swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_google_and_loadmore_refresh_layout);
  63. loadMoreListView = (LoadMoreListView) findViewById(R.id.google_and_loadmore_refresh_listview);
  64. loadMoreListView.setOnRefreshListener(this);
  65. }
  66. /**
  67. * 触发了下拉刷新事件,就会执行onRefresh()方法,这样就能在这个
  68. * 方法中去执行网络获取最新的数据,然后再刷新到listview上面
  69. */
  70. @Override
  71. public void onRefresh() {
  72. //因为本例中没有从网络获取数据,因此这里使用Handler演示4秒延迟来从服务器获取数据的延迟现象,以便于大家
  73. // 能够看到listView正在刷新的状态。大家在现实使用时只需要使用run(){}方法中的代码就行了。
  74. Handler handler = new Handler();
  75. handler.postDelayed(new Runnable() {
  76. @Override
  77. public void run() {
  78. //获取最新的list数据
  79. setRefreshData();
  80. //通知界面显示,
  81. adapter.notifyDataSetChanged();
  82. // 通知listview刷新数据完毕,让listview停止刷新
  83. swipeRefreshLayout.setRefreshing(false);
  84. }
  85. }, 6000);
  86. }
  87. /**
  88. * 模拟加载刷新数据
  89. */
  90. private void setRefreshData() {
  91. //这里只是模拟3个列表项数据,在现实开发中,listview中的数据都是从服务器获取的。
  92. for (int i = 0; i < 3; i++) {
  93. ListViewItem item = new ListViewItem();
  94. item.setUserImg(R.mipmap.ic_launcher);
  95. item.setUserName("seven" + i);
  96. item.setUserComment("这是一个下拉刷新,上拉加载更多的ListView");
  97. items.add(item);
  98. }
  99. }
  100. /**
  101. * ”加载更多“ 的回调接口方法
  102. */
  103. @Override
  104. public void onLoadingMore() {
  105. //因为本例中没有从网络获取数据,因此这里使用Handler演示4秒延迟来从服务器获取数据的延迟现象,以便于大家
  106. // 能够看到listView正在刷新的状态。大家在现实使用时只需要使用run(){}方法中的代码就行了。
  107. Handler handler = new Handler();
  108. handler.postDelayed(new Runnable() {
  109. @Override
  110. public void run() {
  111. //获取最新的list数据
  112. setRefreshData();
  113. //通知界面显示,
  114. adapter.notifyDataSetChanged();
  115. // 通知listview刷新数据完毕,让listview停止刷新,取消加载跟多
  116. loadMoreListView.loadMoreComplete();
  117. }
  118. }, 6000);
  119. }
  120. }

点击打开链接下载示例,免积分

google官方的下拉刷新+自定义上拉加载更多的更多相关文章

  1. Android如何定制一个下拉刷新,上滑加载更多的容器

    前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉 ...

  2. android ListView的上部下拉刷新下部点击加载更多具体实现及拓展

    android ListView的上部下拉刷新下部点击加载更多具体实现及拓展 ListView下拉刷新,上拉自动加载更多 下拉刷新以及加载更多

  3. Android之下拉刷新,上啦加载的实现(一)

    转载地址http://blog.csdn.net/leehong2005/article/details/12567757#t5 前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但 ...

  4. 【Android - 自定义View】之自定义可下拉刷新或上拉加载的ListView

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 RefreshableListView ,继承自ListView类: (2)在这个自定义View中,用户可以设置是否支持下拉刷新 ...

  5. iOS MJRefresh下拉刷新(上拉加载)使用详解

    下拉刷新控件目前比较火的有好几种,本人用过MJRefresh 和 SVPullToRefresh,相对而言,前者比后者可定制化.拓展新都更高一点. 因此本文着重讲一下MJRefresh的简单用法. 导 ...

  6. SVPullToRefresh​ 下拉刷新,上拉加载

    https://github.com/Sephiroth87/ODRefreshControl 类似刷新控件,类似qq动画的那种刷新. 一.下载第三方库 https://github.com/samv ...

  7. iOS开发 XML解析和下拉刷新,上拉加载更多

    iOS开发 XML解析和下拉刷新,上拉加载更多 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示 ...

  8. iscroll 下拉刷新,上拉加载

    新手,直接贴代码了 <!DOCTYPE html><html class=""><head lang="en"><me ...

  9. DCloud-MUI:下拉刷新、上拉加载

    ylbtech-DCloud-MUI:下拉刷新.上拉加载 1. 下拉刷新返回顶部 0. http://dev.dcloud.net.cn/mui/pulldown/ 1. 概述 为实现下拉刷新功能,大 ...

随机推荐

  1. 新注册第一帖----------------------乱码新手自学.net 之Linq 入门篇

    作为一个业余开发,断断续续学.net/c#也有不少日子了, 学习过程中,不断忘了学,学了忘,这让我很苦恼. 以前学习过程中,我总是在笔记本中记录下来知识要点,这么久下来,笔记本都写了四五本了. 然而, ...

  2. 实例了解js面向对象的封装和继承等特点

    1.面向对象特点 相比之前按照过程式写法,面向对象有以下几个特点; 1.抽象:抓住核心问题,就是将很多个方法放在一个对象上.对象由属性和方法组成,属性就是我们定义的变量,它是静态的:方法就是行为操作, ...

  3. JS实例——间歇循环滚动

    间歇滚动:滚动一行后,延迟2秒后继续滚动 具体实现代码如下: <!doctype html> <html lang="en"> <head> & ...

  4. UI培训就业会很难吗

    众所周知UI是研究人机交互的学科,他是从互联网发展而来的,单从目前它的应用领域来看,主要应用于软件.互联网.移动智能设备.游戏和虚拟现实影音方面.这些都是新兴的热门方向和活跃领域.目前人才缺口和社会需 ...

  5. Python3.5 numpy,scipy,安装

    不是特别难,先保证环境变量正确配置 首先,安装了VS2015; 第二,在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下: 第三,下载相对应的 ...

  6. Debian安装Oracle Java步骤

    在Debian下安装OpenJDK使用apt命令非常方便的安装,但安装Oracle就需要手动了,这里需了解ln和update-alternatvies命令. ln链接 首先我们来说说linux的链接, ...

  7. 模仿Wireshark网络抓包工具实现---c++

    最近在用Wireshark抓包工具的时候,老感觉这东西用起来很简单,功能强大,所以想了解他的实现原理,我就自己好奇写了一个实现基本功能的demo吧. 其实叫抓包工具,其实就是抓取流经自己网卡的所有ip ...

  8. Kubernetes 1.5安装

    Kubernetes从1.3开始引入kubeadm来试图简化其复杂的安装.但kubeadm至今仍不稳定,而且我个人觉得kubeadm反而麻烦,还不如直接用脚本或者其他自动化工具来安装来的利索.关于ku ...

  9. 1593: [Usaco2008 Feb]Hotel 旅馆

    1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 391  Solved: 228[Submit ...

  10. DAX/PowerBI系列 - 参数表(Parameter Table)

    DAX/PowerBI系列 - 参数表(Parameter Table) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★☆(4星) 概况: 这个模式比较简单灵活,而且很实用.所用的DAX语句也比较简 ...