转载请标注转载: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. android学习13——android egl hello world

    通常情况下我们使用GLSurfaceview来实现opengl渲染.GLSurfaceview实现上是对SurfaceView和EGL的封装.为了从本质上理解渲染流程,使用EGL和SurfaceVie ...

  2. 快速记录 IE8 下三个问题

    快速记录 IE8 下三个问题 昨天 pc 端网站上灰度,发现多个在 IE8 下的问题,描述和解决方案如下: 第一个问题是 css 文件过大 现象 把项目所有的 css 打包成单个文件,在现代的浏览器下 ...

  3. 从CMOS到触发器(二)

    PS:可以转载,转载请标明出处:http://www.cnblogs.com/IClearner/ 前面说了CMOS器件,现在就接着来聊聊锁存器跟触发器吧,下面是这次博文要介绍的主要内容: ·双稳态器 ...

  4. perl open函数

    open(DATA, "<file.txt"); # <只读打开file.txt ,DATA作为句柄 open(DATA, ">file.txt&quo ...

  5. MySQL C#教程

    这是关于MySQL数据库的C#教程,包含了对MySQL数据库基本操作: 数据库访问组件MySql Connect/NET MySql Connect/NET是MySQL官方提供给C#的接口,封装的非常 ...

  6. Java系统属性与Preferences API的简单介绍

    系统属性在和Preferences API都是键值对,前者只能当前应用程序中共享数据,而后者可以在用户的各个应用或用户之间共享数据. 系统属性 Java 的系统属性决定了 Java 程序实际运行的环境 ...

  7. TypeScript设计模式之备忘录、命令

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  8. .Net程序员学用Oracle系列(22):分析函数(OVER)

    1.函数语法 1.1.语法概述 1.2.窗口详解 1.2.1.ROWS 窗口 1.2.2.RANGE 窗口 2.函数用法 2.1.普通统计类函数 2.2.数据排序类函数 2.3.数据分布类函数 2.4 ...

  9. 卸载php+apache+mysql

    一.卸载删除 mysql   1 sudo apt-get autoremove --purge mysql-server-5.0 2 sudo apt-get remove mysql-server ...

  10. 引用类型-----Object

    本文章转载至:https://segmentfault.com/a/1190000003984584 关于引用类型的概念: 引用类型:引用类型的值(对象)是引用类型的一个实例: 对象:是某个特定引用类 ...