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 我也是因为看 ...
随机推荐
- 【CC2530强化实训02】普通延时函数实现按键的长按与短按
[CC2530强化实训02]普通延时函数实现按键的长按与短按 [题目要求] 用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来计算按键按下的时间是通用的做法 ...
- python初步学习-python 模块之 sys(持续补充)
sys sys 模块包括了一组非常实用的服务,内含很多函数方法和变量 sys 模块重要函数变量 sys.stdin 标准输出流 sys.stdout 标准输出流 sys.stderr 标准错误流 sy ...
- beego项目运行过程
一:首先man.go,整个程序的入口 func main() { beego.Run() } 然后beego.run()代码 // Run beego application. // beego.Ru ...
- Linux硬盘镜像获取与还原(dd、AccessData FTK Imager)
1.硬盘镜像获取工具:dd dd是Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 1.1 本地取数据 查看磁盘及分区 # fdisk - ...
- 5 - django-csrf-session&cookie
目录 1 CSRF跨站请求伪造 1.1 CSRF攻击介绍及防御 1.2 防御CSRF攻击 1.2.1 验证 HTTP Referer 字段 1.2.2 在请求地址中添加 token 并验证 1.2.3 ...
- Ubuntu server 搭建Git server【转】
转自:http://www.cnblogs.com/candle806/p/4064610.html Ubuntu server 搭建Git server,git相比svn,最主要就是分布式了,每个客 ...
- idea中使用tomcat 方式启动spring boot项目
Spring boot 的main 入口启动方式相信都会用,直接运行main直接就启动了,但是往往这种方式并不是最佳的启动方式,比如运维的层面更希望调整tomcat的调优参数,而只使用嵌入启动方式很难 ...
- Django中cookie和session
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- 十、springboot之web开发打包生产
打成war包 打成war包一般可以分两种方式来实现,第一种可以通过eclipse这种开发工具来导出war包,另外一种是使用命令来完成,这里主要介绍后一种 1.修改配置文件 maven:pom文件 &l ...
- java基础75 xpth技术(网页知识)
1.xpth技术 1.1.xpath的作用 主要用于快速获取所需的节点对象. list<Node> selectNodes("xpath"); 查询多个节点对象 ...