Android ListView 自动加载更多
Android ListView下拉刷新
ListView是我们经常用来展示数据的一个控件,但是由于我们手机的性能和流量的问题,往往我们从服务器中取数据,不能一次性将数据取出来,比如一个新闻的手机APP,每天的新闻是非常多的,单论传输数据的流量就是一个天文数字,所以我们要经常实现类似
下拉刷新的功能。
- 首先加载数据的时候先加载一小部分
 - 每次当滚动到最后的时候,进行一次自动刷新或者是让用户选择刷新
 
效果图

实现
- 为了方便我们以后重复使用该ListView我么需要做一些封装,新建一个类来继承我们ListView类
 - 下方的进图条是我们的ListView的footerView
 - 封装一个接口,当给我们的listview到最后的时候,调用该回调函数,进行更新数据,并将我们的进度条隐藏
 
主要代码
ListView代码
package com.example.it.studypulltoreference;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.ProgressBar;
/*
* 具有下拉刷新的listView
* */
public class PullToRefreshListView extends ListView implements AbsListView.OnScrollListener {
    private View footerView;// FooterView ListView的页脚
    private ProgressBar pbRefresh;// footerView中的 进图条控件
    private int currentItemCount; //表示当前已经存在的Item的数量
    private int totalCount; //全部Item的数量
    private OnLoad onLoad; //加载数据时执行的事件
    //region 构造函数
    public PullToRefreshListView(Context context) {
        super(context);
        init();
    }
    public PullToRefreshListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public PullToRefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    public PullToRefreshListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }
    //endregion
    //初始化方法
    private void init() {
        LayoutInflater inflater = LayoutInflater.from(this.getContext());
        footerView = inflater.inflate(R.layout.footerview_refresh, null);
        pbRefresh = (ProgressBar) footerView.findViewById(R.id.pbRefresh);
        pbRefresh.setVisibility(GONE);
        //为ListView添加页脚
        this.addFooterView(footerView);
        this.setOnScrollListener(this);
    }
    /*
    * 回调方法:当ListView或者GridVie被滑动的时候在下一帧动滑动动画渲染完成之前调用此方法
    * */
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        /*
        * 如果当前的所存在的Item的数量已经是等于全部的Item的数量的那么
        * 我们需要进行自动刷新数据
        * */
        //已经滑动到底部,并且用户没有进行滑动操作时刷新数据
        if (currentItemCount == totalCount && scrollState == SCROLL_STATE_IDLE) {
            this.pbRefresh.setVisibility(VISIBLE);
            //执行刷新操作
            this.onLoad.loadData(this.currentItemCount, this.pbRefresh);
        }
    }
    /*
    * 回调方法:当list 或者 grid 正在被滑动的时候调用,调用在滑动完成之前
    * view 报告滚动状态的View
    * firstVisibleItem:第一个可见的Item的索引,如果当前没有可见的Cells 那么为0
    * visibleItemCount 当前可见列的数量
    * totalItemCount Adapter 数据项的数量
    * */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        //在滚动事件中不断的更新 已经存在的Item的数量
        currentItemCount = firstVisibleItem + visibleItemCount;
        totalCount = totalItemCount;
    }
    //为onLoad赋值
    public void setOnLoad(OnLoad onLoad) {
        this.onLoad = onLoad;
    }
    /*
    * 回调函数的接口
    * */
    public interface OnLoad {
        void loadData(int beginIndex, ProgressBar pb);
    }
}
调用代码
package com.example.it.studypulltoreference;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import java.util.ArrayList;
import java.util.List;
public class HomeActivity extends AppCompatActivity implements PullToRefreshListView.OnLoad {
    private int stepCount = 30;//每次刷新加载的内容的数量
    private List<String> stringList = new ArrayList<String>();
    private DataAdapter adapter;
    private PullToRefreshListView listView;
    /*
    * 初始化一些模拟的数据
    * */
    private void initData() {
        for (int i = 0; i < 200; i++) {
            stringList.add("程序猿" + (i + 1));
        }
    }
	//初始化ListView
    private void init() {
        adapter = new DataAdapter(this, new ArrayList<String>());
        this.listView.setAdapter(adapter);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        listView = (PullToRefreshListView) this.findViewById(R.id.lvData);
        init();
        initData();
        //设置刷新数据的方法
        listView.setOnLoad(this);
        loadData(0, null);
    }
    /*
    * 想Adapter中的数据源填充数据
    * */
    @Override
    public void loadData(final int beginIndex, final ProgressBar pb) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //如果pb不为null不是初始化数据
                if (pb != null) {
                    //模拟加载中 睡眠 2秒
                    SystemClock.sleep(2000l);
                }
                for (int i = beginIndex; i < beginIndex + stepCount; i++) {
                    if (i < stringList.size())
                        adapter.addItem(stringList.get(i));
                }
                //加载数据完成回更新UI
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (pb != null)
                            pb.setVisibility(View.GONE);
                        //刷新Adapter
                        adapter.notifyDataSetChanged();
                    }
                });
            }
        }).start();
    }
}
源码下载
http://git.oschina.net/ShareKnowledge/pull_to_reference
Android ListView 自动加载更多的更多相关文章
- 实现Android ListView 自动加载更多内容
		
研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...
 - ListView下拉刷新,上拉自动加载更多
		
下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的Android客户端源码.先看示例图. ...
 - UWP-ListView到底部自动加载更多数据
		
原文:UWP-ListView到底部自动加载更多数据 ListView绑定的数据当需要“更多”时自动加载 ListView划到底部后,绑定的ObservableCollection列表数据需要加载的更 ...
 - jQuery自动加载更多程序
		
1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据,这种方式加快了数据的加载速度,由 ...
 - 基于JQuery实现滚动到页面底端时自动加载更多信息
		
基于JQuery实现滚动到页面底端时自动加载更多信息 关键代码: 代码如下: var stop=true; $(window).scroll(function(){ totalheight = par ...
 - jQuery自动加载更多程序(转)
		
jQuery自动加载更多程序 1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据 ...
 - Android RecyclerView 瀑布流滑动到最后自动加载更多
		
mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener(){ //用来标记是否正在向最后一个滑动,既是否向下滑动 bool ...
 - Android 上拉加载更多功能
		
前几天看了github上面的例子,参照它的实现,自己又稍微改了一点,往项目里面增加了一个上拉加载更多功能.具体的实现如下: 首先要重写ListView: import android.content. ...
 - 又优化了一下 Android ListView 异步加载图片
		
写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...
 
随机推荐
- 用Emacs看电影
			
大多数人用emacs听歌,我却喜欢用emacs看电影.用 EMMS 和 mplayer 结合,看电影真是太方便了. 不要从源里安装EMMS,它可能给你安装别的播放器,没必要,我们有 mplayer 足 ...
 - 可视化爬虫Portia安装和部署踩过的坑
			
背景 Scrapy爬虫的确是好使好用,去过scrapinghub的官网浏览一下,更是赞叹可视化爬虫的犀利.scrapinghub有一系列的产品,开源了大部分项目,Portia负责可视化爬虫的编辑,Sp ...
 - 基本控件文档-UISlider属性
			
CHENYILONG Blog 基本控件文档-UISlider属性 Fullscreen UISlide属性技术博客http://www.cnblogs.com/ChenYilong/ 新浪微 ...
 - Request爬取网站(seo.chinaz.com)百度权重的查询结果
			
一:脚本需求 利用Python3查询网站权重并自动存储在本地数据库(Mysql数据库)中,同时导出一份网站权重查询结果的EXCEL表格 数据库类型:MySql 数据库表单名称:website_weig ...
 - 【译】第十五篇 Integration Services:SSIS参数
			
本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...
 - lucene总结——(十七)
			
(01)rownum和rowid有何区别? rownum在表结构中是看不见的,只能在select中明确写出rownum方可显示 rownum与不同的表绑定在一起,每张表都有自已的r ...
 - 【h5标签转小程序标签】小程序使用wxParse解析html教程
			
一.先下载所需文件,下载地址:https://pan.baidu.com/s/1umZO9uI24zUTRd7VqaWbAg ,下载完毕后会得到一个wxParse文件夹,后面会用到: 二.先拷贝cs ...
 - java基础47 装饰着模式设计
			
1.装饰者模式 增强一个类的功能,而且还可以让这些装饰类相互装饰 2.装饰者设计模式的步骤 1.在装饰类的内部维护一个被装饰类的引用 2.让装饰者有一个共同的父类或者父接口 3.实例 packa ...
 - java基础27 单例集合Collection及其常用方法
			
1.集合 集合是存储对象数据的集合容器 1.1.集合比数组的优势 1.集合可以存储任意类型的数据,数组只能存储同一种数据类型的数据 2.集合的长度是变化的,数组的长度是固定的 1.2.数组:存储 ...
 - Robust Mesh Watermarking
			
之前看了一篇题为"Robust Mesh Watermarking"的论文,查阅资料的时候发现了一篇与之很相似的名为"三维模型数字水印系统的设计与实现"的中文论 ...