转自:http://blog.csdn.net/jdfkldjlkjdl/article/details/70229465

这次使用的是系统的SwipeRefreshLayout实现下拉刷新,和设置ListView的滑动监听判断是否滑动到最底部然后加载更多;如果想了解用另一种方式实现这个功能,请移步http://blog.csdn.net/jdfkldjlkjdl/article/details/51277941

其中,SwipeRefreshLayout的几个方法功能如下:

1、setOnRefreshListener():设置手势滑动监听器。
2、setProgressBackgroundColor():设置进度圈的背景色。
3、setColorSchemeResources():设置进度动画的颜色。
4、setRefreshing():设置组件的刷洗状态。
5、setSize():设置进度圈的大小

下面说一下实现步骤:

1.添加布局文件

  1. <android.support.v4.widget.SwipeRefreshLayout
  2. android:id="@+id/mSwipeRefreshLayout"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ListView
  6. android:id="@+id/mListView"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:divider="#cccccc"
  10. android:dividerHeight="1px"/>
  11. </android.support.v4.widget.SwipeRefreshLayout>

2.添加加载更多的布局文件load_more.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/ll_load_more"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:orientation="vertical">
  7. <LinearLayout
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_gravity="center_horizontal"
  11. android:layout_margin="10dip"
  12. android:gravity="center_vertical"
  13. android:orientation="horizontal">
  14. <ProgressBar
  15. android:layout_width="30dp"
  16. android:layout_height="30dp"
  17. android:layout_gravity="center"
  18. />
  19. <TextView
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:layout_marginLeft="10dip"
  23. android:text="加载更多"
  24. android:textColor="#bbb"
  25. android:textSize="12sp"/>
  26. </LinearLayout>
  27. </LinearLayout>

3.绑定下拉刷新事件

  1. //设置手势监听
  2. mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
  3. @Override
  4. public void onRefresh() {
  5. mHandler.sendEmptyMessageDelayed(REFRESH, 2000);
  6. }
  7. });

4.绑定上拉加载更多事件

  1. //给listview设置一个滑动的监听
  2. mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
  3. int visibleLastIndex = 0;    //最后的可视项索引
  4. int visibleItemCount;        // 当前窗口可见项总数
  5. //当滑动状态发生改变的时候执行
  6. public void onScrollStateChanged(AbsListView view, int scrollState) {
  7. switch (scrollState) {
  8. //当不滚动的时候
  9. case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
  10. int itemsLastIndex = adapter.getCount() - 1;    //数据集最后一项的索引
  11. int lastIndex = itemsLastIndex + 1;                //加上底部的loadMoreView项
  12. //判断是否是最底部
  13. //if (view.getLastVisiblePosition() == (view.getCount()) - 1) { //或者
  14. if (visibleLastIndex == lastIndex) {
  15. loadMoreView.setVisibility(View.VISIBLE);
  16. mHandler.postDelayed(new Runnable() {
  17. @Override
  18. public void run() {
  19. //加载网络数据
  20. Message msg = new Message();
  21. msg.what = LOADMORE;
  22. msg.arg1 = visibleLastIndex - visibleItemCount + 1;
  23. mHandler.sendMessage(msg);
  24. }
  25. }, 2000);
  26. }
  27. break;
  28. }
  29. }
  30. //正在滑动的时候执行
  31. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  32. this.visibleItemCount = visibleItemCount;
  33. visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
  34. }
  35. });

完整的activity代码如下:

  1. package demo.xzy.qh.com.listviewpulltorefreshandloadmore;
  2. import android.app.Activity;
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.Message;
  7. import android.support.v4.widget.SwipeRefreshLayout;
  8. import android.view.View;
  9. import android.widget.AbsListView;
  10. import android.widget.ArrayAdapter;
  11. import android.widget.ListView;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. /**
  15. * ListView下拉刷新,上拉加载demo
  16. */
  17. public class MainActivity extends Activity {
  18. private SwipeRefreshLayout mSwipeRefreshLayout;
  19. private ListView mListView;
  20. private List<String> data = new ArrayList<>();
  21. private ArrayAdapter<String> adapter;
  22. private static final int REFRESH = 0x01;
  23. private static final int LOADMORE = 0x02;
  24. private View loadMoreView;
  25. private Handler mHandler = new Handler() {
  26. @Override
  27. public void handleMessage(Message msg) {
  28. super.handleMessage(msg);
  29. switch (msg.what) {
  30. case REFRESH:
  31. data.add(0, "刷新得到的数据");
  32. adapter.notifyDataSetChanged();
  33. mSwipeRefreshLayout.setRefreshing(false);
  34. break;
  35. case LOADMORE:
  36. for (int x = 0; x < 5; x++) {
  37. data.add(data.size(), "aaaaaa" + x);
  38. }
  39. adapter.notifyDataSetChanged();    //数据集变化后,通知adapter
  40. int position = msg.arg1;
  41. mListView.setSelection(position);    //设置选中项
  42. loadMoreView.setVisibility(View.GONE);
  43. break;
  44. }
  45. }
  46. };
  47. @Override
  48. protected void onCreate(Bundle savedInstanceState) {
  49. super.onCreate(savedInstanceState);
  50. setContentView(R.layout.activity_main);
  51. for (int i = 0; i < 6; i++) {
  52. data.add("测试数据" + i);
  53. }
  54. initView();
  55. }
  56. private void initView() {
  57. mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.mSwipeRefreshLayout);
  58. mListView = (ListView) findViewById(R.id.mListView);
  59. loadMoreView = getLayoutInflater().inflate(R.layout.load_more, null);
  60. loadMoreView.setVisibility(View.GONE);
  61. mListView.addFooterView(loadMoreView);
  62. mListView.setFooterDividersEnabled(false);
  63. //设置进度圈的大小;(这里面只有两个值SwipeRefreshLayout.LARGE和DEFAULT,后者是默认效果)
  64. mSwipeRefreshLayout.setSize(SwipeRefreshLayout.DEFAULT);
  65. //设置进度圈的背景色。这里随便给他设置了一个颜色:浅绿色
  66. mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.CYAN);
  67. //设置进度动画的颜色。这里面最多可以指定四个颜色,我这也是随机设置的,大家知道怎么用就可以了
  68. mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_orange_dark
  69. , android.R.color.holo_blue_dark
  70. , android.R.color.holo_red_dark
  71. , android.R.color.widget_edittext_dark);
  72. adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, data);
  73. mListView.setAdapter(adapter);
  74. //设置手势监听
  75. mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
  76. @Override
  77. public void onRefresh() {
  78. mHandler.sendEmptyMessageDelayed(REFRESH, 2000);
  79. }
  80. });
  81. //给listview设置一个滑动的监听
  82. mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
  83. int visibleLastIndex = 0;    //最后的可视项索引
  84. int visibleItemCount;        // 当前窗口可见项总数
  85. //当滑动状态发生改变的时候执行
  86. public void onScrollStateChanged(AbsListView view, int scrollState) {
  87. switch (scrollState) {
  88. //当不滚动的时候
  89. case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
  90. int itemsLastIndex = adapter.getCount() - 1;    //数据集最后一项的索引
  91. int lastIndex = itemsLastIndex + 1;                //加上底部的loadMoreView项
  92. //判断是否是最底部
  93. //if (view.getLastVisiblePosition() == (view.getCount()) - 1) { //或者
  94. if (visibleLastIndex == lastIndex) {
  95. loadMoreView.setVisibility(View.VISIBLE);
  96. mHandler.postDelayed(new Runnable() {
  97. @Override
  98. public void run() {
  99. //加载网络数据
  100. Message msg = new Message();
  101. msg.what = LOADMORE;
  102. msg.arg1 = visibleLastIndex - visibleItemCount + 1;
  103. mHandler.sendMessage(msg);
  104. }
  105. }, 2000);
  106. }
  107. break;
  108. }
  109. }
  110. //正在滑动的时候执行
  111. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  112. this.visibleItemCount = visibleItemCount;
  113. visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
  114. }
  115. });
  116. }
  117. }

整个demo很简单,就两个布局文件和一个activity。

至此,标题中提到的功能已经实现。欢迎留言指正。

ListView封装实现下拉刷新和上拉加载(方式2)(转载)的更多相关文章

  1. android--------自定义控件ListView实现下拉刷新和上拉加载

    开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,为了方便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能. Android下拉刷新可以分为两种情况: 1.获取 ...

  2. Diycode开源项目 搭建可以具有下拉刷新和上拉加载的Fragment

    1.效果预览 1.1.这个首页就是一个Fragment碎片,本文讲述的就是这个碎片的搭建方式. 下拉会有一个旋转的刷新圈,上拉会刷新数据. 1.2.整体结构 首先底层的是BaseFragment 然后 ...

  3. Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理

    RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...

  4. Android 使用PullToRefresh实现下拉刷新和上拉加载(ExpandableListView)

    PullToRefresh是一套实现非常好的下拉刷新库,它支持: 1.ListView 2.ExpandableListView 3.GridView 4.WebView 等多种常用的需要刷新的Vie ...

  5. 使用PullToRefresh实现下拉刷新和上拉加载

    使用PullToRefresh实现下拉刷新和上拉加载 分类: Android2013-12-20 15:51 78158人阅读 评论(91) 收藏 举报 Android下拉刷新上拉加载PullToRe ...

  6. 安卓开发笔记——关于开源组件PullToRefresh实现下拉刷新和上拉加载(一分钟搞定,超级简单)

    前言 以前在实现ListView下拉刷新和上拉加载数据的时候都是去继承原生的ListView重写它的一些方法,实现起来非常繁杂,需要我们自己去给ListView定制下拉刷新和上拉加载的布局文件,然后添 ...

  7. Android实现RecyclerView的下拉刷新和上拉载入很多其它

    需求 先上效果图, Material Design风格的下拉刷新和上拉载入很多其它. 源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2 假设对于 ...

  8. iscroll.js 下拉刷新和上拉加载

    html代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  9. IOS 开发下拉刷新和上拉加载更多

    IOS 开发下拉刷新和上拉加载更多 简介 1.常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTTableViewrefresh (3)AH3DPullRefresh ( ...

  10. IOS UITableView下拉刷新和上拉加载功能的实现

    在IOS开发中UITableView是非常常用的一个功能,而在使用UITableView的时候我们经常要用到下拉刷新和上拉加载的功能,今天花时间实现了简单的UITableView的下拉刷新和上拉加载功 ...

随机推荐

  1. C++判断字符是否是元音字母

    写这个随笔的起因很奇怪. 我本来想找找C++有没有内置的函数(类似isalpha(), isdigit(), isalnum()之流)能直接完成这个功能,但是函数没发现,却发现很多博客都是逐个字符判断 ...

  2. Jenkins的安装、部署、启动(完整教程)

    测试环境 Linux系统 Centos 7 安装步骤: 1.安装jdk 我安装的是jdk8,此处就不多说了,自己百度哈,很简单 2.安装jenkins 首先依次执行如下三个命令: 2.1.导入镜像: ...

  3. JavaSE---基本数据类型存储大小

  4. Edge Computer:Vision and Challenges

    Abstract 随着物联网(Internet of Things)的蓬勃发展和云服务(cloud services)的成功,出现一种新的计算模式:edge computer.用于边缘网络数据的处理, ...

  5. 【Flutter学习】组件通信(父子、兄弟)

    一,概述 flutter一个重要的特性就是组件化.组件分为两种状态,一种是StatefulWidget有状态组件,一种是StatelessWidget无状态组件. 无状态组件不能更新状态,有状态组件具 ...

  6. VS2013 MFC基于对话框编程

    前言一直利用Qt库做Ui设计,但针对于一些MFC项目,掌握一些必要的MFC开发技巧还是很有必要的.这篇博客里就将自己所学的一些MFC浅显知识记录一下,方便今后的学习.博客里只记录关键步骤. 一.新建M ...

  7. Cent OS 7下安装 mongodb

    1.下载MongoDB 安装包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.8.tgz 2.解压并安装 .tgz 3. ...

  8. ArcGIS Runtime SDK for .NET (Quartz Beta)之连接ArcGIS Portal

    1. 介绍 ArcGIS Portal作为ArcGIS平台的中枢,在ArcGIS体系中起着至关重要的地位.在ArcGIS Runtime的新架构Quartz中添加了连接ArcGIS Portal(或A ...

  9. php开发面试题---Redis和Memcache区别,优缺点对比

    php开发面试题---Redis和Memcache区别,优缺点对比 一.总结 一句话总结: Redis相当于Memcache的扩展,增加比如持久化.多种数据结构.集群分布式功能 反思的回顾非常有用,因 ...

  10. seleniumIDE command命令

    语法组成要素:command.target.value. command命令 三大类型:(action.Accessor.assertion)   操作  存储  断言 操作类型——Action 浏览 ...