Android ListView下拉刷新

ListView是我们经常用来展示数据的一个控件,但是由于我们手机的性能和流量的问题,往往我们从服务器中取数据,不能一次性将数据取出来,比如一个新闻的手机APP,每天的新闻是非常多的,单论传输数据的流量就是一个天文数字,所以我们要经常实现类似下拉刷新的功能。

  • 首先加载数据的时候先加载一小部分
  • 每次当滚动到最后的时候,进行一次自动刷新或者是让用户选择刷新

效果图

实现

  1. 为了方便我们以后重复使用该ListView我么需要做一些封装,新建一个类来继承我们ListView类
  2. 下方的进图条是我们的ListView的footerView
  3. 封装一个接口,当给我们的listview到最后的时候,调用该回调函数,进行更新数据,并将我们的进度条隐藏

主要代码

ListView代码

  1. package com.example.it.studypulltoreference;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.widget.AbsListView;
  7. import android.widget.ListView;
  8. import android.widget.ProgressBar;
  9. /*
  10. * 具有下拉刷新的listView
  11. * */
  12. public class PullToRefreshListView extends ListView implements AbsListView.OnScrollListener {
  13. private View footerView;// FooterView ListView的页脚
  14. private ProgressBar pbRefresh;// footerView中的 进图条控件
  15. private int currentItemCount; //表示当前已经存在的Item的数量
  16. private int totalCount; //全部Item的数量
  17. private OnLoad onLoad; //加载数据时执行的事件
  18. //region 构造函数
  19. public PullToRefreshListView(Context context) {
  20. super(context);
  21. init();
  22. }
  23. public PullToRefreshListView(Context context, AttributeSet attrs) {
  24. super(context, attrs);
  25. init();
  26. }
  27. public PullToRefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {
  28. super(context, attrs, defStyleAttr);
  29. init();
  30. }
  31. public PullToRefreshListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  32. super(context, attrs, defStyleAttr, defStyleRes);
  33. init();
  34. }
  35. //endregion
  36. //初始化方法
  37. private void init() {
  38. LayoutInflater inflater = LayoutInflater.from(this.getContext());
  39. footerView = inflater.inflate(R.layout.footerview_refresh, null);
  40. pbRefresh = (ProgressBar) footerView.findViewById(R.id.pbRefresh);
  41. pbRefresh.setVisibility(GONE);
  42. //为ListView添加页脚
  43. this.addFooterView(footerView);
  44. this.setOnScrollListener(this);
  45. }
  46. /*
  47. * 回调方法:当ListView或者GridVie被滑动的时候在下一帧动滑动动画渲染完成之前调用此方法
  48. * */
  49. @Override
  50. public void onScrollStateChanged(AbsListView view, int scrollState) {
  51. /*
  52. * 如果当前的所存在的Item的数量已经是等于全部的Item的数量的那么
  53. * 我们需要进行自动刷新数据
  54. * */
  55. //已经滑动到底部,并且用户没有进行滑动操作时刷新数据
  56. if (currentItemCount == totalCount && scrollState == SCROLL_STATE_IDLE) {
  57. this.pbRefresh.setVisibility(VISIBLE);
  58. //执行刷新操作
  59. this.onLoad.loadData(this.currentItemCount, this.pbRefresh);
  60. }
  61. }
  62. /*
  63. * 回调方法:当list 或者 grid 正在被滑动的时候调用,调用在滑动完成之前
  64. * view 报告滚动状态的View
  65. * firstVisibleItem:第一个可见的Item的索引,如果当前没有可见的Cells 那么为0
  66. * visibleItemCount 当前可见列的数量
  67. * totalItemCount Adapter 数据项的数量
  68. * */
  69. @Override
  70. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  71. //在滚动事件中不断的更新 已经存在的Item的数量
  72. currentItemCount = firstVisibleItem + visibleItemCount;
  73. totalCount = totalItemCount;
  74. }
  75. //为onLoad赋值
  76. public void setOnLoad(OnLoad onLoad) {
  77. this.onLoad = onLoad;
  78. }
  79. /*
  80. * 回调函数的接口
  81. * */
  82. public interface OnLoad {
  83. void loadData(int beginIndex, ProgressBar pb);
  84. }
  85. }

调用代码

  1. package com.example.it.studypulltoreference;
  2. import android.os.SystemClock;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.ProgressBar;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class HomeActivity extends AppCompatActivity implements PullToRefreshListView.OnLoad {
  10. private int stepCount = 30;//每次刷新加载的内容的数量
  11. private List<String> stringList = new ArrayList<String>();
  12. private DataAdapter adapter;
  13. private PullToRefreshListView listView;
  14. /*
  15. * 初始化一些模拟的数据
  16. * */
  17. private void initData() {
  18. for (int i = 0; i < 200; i++) {
  19. stringList.add("程序猿" + (i + 1));
  20. }
  21. }
  22. //初始化ListView
  23. private void init() {
  24. adapter = new DataAdapter(this, new ArrayList<String>());
  25. this.listView.setAdapter(adapter);
  26. }
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_home);
  31. listView = (PullToRefreshListView) this.findViewById(R.id.lvData);
  32. init();
  33. initData();
  34. //设置刷新数据的方法
  35. listView.setOnLoad(this);
  36. loadData(0, null);
  37. }
  38. /*
  39. * 想Adapter中的数据源填充数据
  40. * */
  41. @Override
  42. public void loadData(final int beginIndex, final ProgressBar pb) {
  43. new Thread(new Runnable() {
  44. @Override
  45. public void run() {
  46. //如果pb不为null不是初始化数据
  47. if (pb != null) {
  48. //模拟加载中 睡眠 2秒
  49. SystemClock.sleep(2000l);
  50. }
  51. for (int i = beginIndex; i < beginIndex + stepCount; i++) {
  52. if (i < stringList.size())
  53. adapter.addItem(stringList.get(i));
  54. }
  55. //加载数据完成回更新UI
  56. runOnUiThread(new Runnable() {
  57. @Override
  58. public void run() {
  59. if (pb != null)
  60. pb.setVisibility(View.GONE);
  61. //刷新Adapter
  62. adapter.notifyDataSetChanged();
  63. }
  64. });
  65. }
  66. }).start();
  67. }
  68. }

源码下载

http://git.oschina.net/ShareKnowledge/pull_to_reference

Android ListView 自动加载更多的更多相关文章

  1. 实现Android ListView 自动加载更多内容

    研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...

  2. ListView下拉刷新,上拉自动加载更多

    下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的Android客户端源码.先看示例图.       ...

  3. UWP-ListView到底部自动加载更多数据

    原文:UWP-ListView到底部自动加载更多数据 ListView绑定的数据当需要“更多”时自动加载 ListView划到底部后,绑定的ObservableCollection列表数据需要加载的更 ...

  4. jQuery自动加载更多程序

    1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据,这种方式加快了数据的加载速度,由 ...

  5. 基于JQuery实现滚动到页面底端时自动加载更多信息

    基于JQuery实现滚动到页面底端时自动加载更多信息 关键代码: 代码如下: var stop=true; $(window).scroll(function(){ totalheight = par ...

  6. jQuery自动加载更多程序(转)

    jQuery自动加载更多程序   1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据 ...

  7. Android RecyclerView 瀑布流滑动到最后自动加载更多

    mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener(){ //用来标记是否正在向最后一个滑动,既是否向下滑动 bool ...

  8. Android 上拉加载更多功能

    前几天看了github上面的例子,参照它的实现,自己又稍微改了一点,往项目里面增加了一个上拉加载更多功能.具体的实现如下: 首先要重写ListView: import android.content. ...

  9. 又优化了一下 Android ListView 异步加载图片

    写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...

随机推荐

  1. java 连接Kafka报错java.nio.channels.ClosedChannelExcep

    Java 客户端连接Kafka报如下错误 java.nio.channels.ClosedChannelExcep 是由于Kafka server.properties中的advertised.hos ...

  2. C++中getline()和cin()同时使用时的注意事项

    今天做tju的oj,遇到一个问题,想前部分用cin函数一个一个的读入数据,中间部分利用getline()一起读入一行,但是测试发现,cin之后的getline函数并无作用,遂谷歌之.原来cin只是在缓 ...

  3. 双击CAD对象,显示自定义对话框实现方法

    class TlsApplication : IExtensionApplication { void IExtensionApplication.Initialize() { TTest.Start ...

  4. mybatis查询参数为0时无法识别问题

    最近在工作中遇到一个mybatis参数问题,主要是列表查询按照状态进行过滤,其中已完成状态值是0,被退回是1.如图所示 , 然后Mapper里面是和平常一样的写法<if test="s ...

  5. shell监控网站是否自动运行并自动重启【原创】

    shell监控网站是否自动运行并自动重启 #!/bin/bash -T www.baidu.com ];then echo "`date` 网站访问正常!" >> /r ...

  6. 2017北京网络赛 Bounce GCD加找规律

    题目链接:http://hihocoder.com/problemset/problem/1584 题意:就是求一个小球从矩阵的左上角,跑到矩形的右下角不能重复经过的格子,小球碰到墙壁就反射. 解法: ...

  7. vue总结 03过滤器

    过滤器 Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaS ...

  8. 利用vw+rem实现移动web适配布局

    基本概念 1.单位 Px(CSS pixels) 像素 (px) 是一种绝对单位(absolute units), 因为无论其他相关的设置怎么变化,像素指定的值是不会变化的 其实是相对于某个设备而言的 ...

  9. GitHub在线创建文件夹

    点击New files按钮,然后输入含有slash字符(“/”)的文件名即可.也就是建立一个含有路径(目录)的文件,即会自动产生新文件夹. 点击Upload files按钮,然后直接把本地的文件夹(内 ...

  10. SQL 2008 还原SQL 2005备份文件不成功的解决方

    在SQL Server 2008 r2上还原一个SQL Server 2005时,还原不成功,提示如下信息: 按照如下情况则还原成功: -- 查看备份文件的类型 RESTORE FILELISTONL ...