在上一篇中,我们实现了底部布局(即带上了进度条)。没有读过的朋友可以点击下面的链接:

http://www.cnblogs.com/fuly550871915/p/4866966.html

但是进度条的消失,以及数据的加载我们都没有实现,那么在本节中,我们来完成分页加载。具体的效果我就不贴图了,就是第一篇效果展示的那些效果。

代码还是 有些难度。需要用到回调接口,实现ListView的下拉监听等知识以及判断何时进度条出现何时消失等。

陈述一下具体逻辑吧。首先在initView中,我们不仅要加上底布局,还应该时底布局消失。然后我们实现ListView的OnScrollListener接口,监听它的滚动。在其中的一个方法onScroll,我们可以获得到当前第一个可见item的编号以及当前有多少个可见item和总共有多少个item。这样子我们就可以轻易由计算得出是否滚动带最底部了。然后在onSrollStateChanged方法中做判断,如果滚动到最底部,就显示出正在加载数据的进度条,并完成数据的加载。但是有一个问题是,加载的数据在MainActivity里面,我们怎么在MyListView中获得加载的数据?这就要使用接口回调,我们在MyListView中设定一个回调接口,然后在MainAcivty中回调,就可以实现MyListView获得加载的数据。 好了,大体逻辑就是这样子的,剩下的就是细节上的逻辑了。我们看代码,注释解释的也很清楚了。如下:

 package com.fuly.load;

 import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView; public class MyListView extends ListView implements OnScrollListener{ private int lastVisibleItem;//最后一个可见的item private int totalItemCount;//总的item private boolean isLoading = false;//是否正在加载数据 private ILoadListener mListener;//回调接口,用来加载数据 private View footer;//底布局 //注意,三个构造方法都要重写
public MyListView(Context context) {
super(context);
initView(context); }
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
} //定义一个回调接口,用来获得要加载的数据
public interface ILoadListener{
void loadData();
} public void setOnILoadListener(ILoadListener listener){ this.mListener = listener;
} //初始化view
private void initView(Context context){ footer = LayoutInflater.from(context).inflate(R.layout.footer, null); //注意,这句代码的意思是给自定义的ListView加上底布局
this.addFooterView(footer); //首先需要隐藏这个底部布局
footer.findViewById(R.id.load_layout).setVisibility(View.GONE); this.setOnScrollListener(this);//千万别忘记设定监听器 } //加载数据完成后,需要执行的操作
public void loadFinish(){ isLoading = false;//不再加载了
//底布局也要隐藏
footer.findViewById(R.id.load_layout).setVisibility(View.GONE); } //参数scrollState表示滑动的状态
public void onScrollStateChanged(AbsListView view, int scrollState) { //如果最后一个可见item等于总的item,且当前滚动状态为滚动停止,就应该开始加加载数据了
if(lastVisibleItem == totalItemCount && scrollState==SCROLL_STATE_IDLE){ if(!isLoading){
isLoading = true; //加载数据
mListener.loadData();
//设置底布局可见
footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE);
}
} } /***
* 该方法用来监听实时滚动中的item
* firstVisibleItem:当前第一个可见的item
* visibleItemCount:当前总共有多少个可见的item
* totalItemCount:总的item
*/
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) { this.lastVisibleItem = firstVisibleItem + visibleItemCount;
this.totalItemCount = totalItemCount; } }

然后我们再修改MainActivity中的代码即可,如下:

 package com.fuly.load;

 import java.util.ArrayList;
import java.util.List; import com.fuly.load.MyListView.ILoadListener; import android.os.Bundle;
import android.os.Handler;
import android.app.Activity; public class MainActivity extends Activity implements ILoadListener{ private MyListView lv;
private List<MyData> mDatas = new ArrayList<MyData>();
private MyAdapter mAdapter; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initData();//该方法初始化数据
lv = (MyListView) findViewById(R.id.list_view);
lv.setOnILoadListener(this);
mAdapter = new MyAdapter(this, mDatas);
lv.setAdapter(mAdapter); } /**
* 该方法初始化数据,即提供初始的素材
*/
private void initData() {
for(int i = 0;i<12;i++){
MyData md = new MyData("你好,我是提前设定的");
mDatas.add(md);
} } /**
* 该方法提供模拟的加载数据
*/
private void getLoadData() {
for(int i = 0;i<3;i++){
MyData md = new MyData("你好,我是加载进来的");
mDatas.add(md);
} } //重写回调方法
public void loadData() { //注意之所以使用Handlder,主要是想让下面的
//操作延迟5秒钟,以体现效果。实际开发中不需要
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable(){ public void run() { //获得加载数据
getLoadData();
//然后通知MyListView刷新界面
mAdapter.notifyDataSetChanged(); //然后通知加载数据已经完成了 lv.loadFinish();
} }, 5000); } }

好了,一切都OK了。运行吧,看看分页加载到底是什么效果!

ListView实现分页加载(三)实现分页加载的更多相关文章

  1. listview下拉刷新 上拉(滑动分页)加载更多

    最 近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多.新浪微博就是使用这种方式的典型.当用户从网络上读取微博的时候, ...

  2. hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存

    QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...

  3. [转]微信小程序之加载更多(分页加载)实例 —— 微信小程序实战系列(2)

    本文转自;http://blog.csdn.net/michael_ouyang/article/details/56846185 loadmore 加载更多(分页加载) 当用户打开一个页面时,假设后 ...

  4. layui数据表格分页加载动画,自己定义加载动画,"加载中..."

    记录思路,仅供参考 在表格渲染完成后,在done回调函数中给分页动态加点击事件, 关闭"加载中..."动画也是在 done回调函数中关闭 这是我实现的思路,记录给大家参考. , d ...

  5. Spring Boot GraphQL 实战 03_分页、全局异常处理和异步加载

    hello,大家好,我是小黑,又和大家见面啦~ 今天我们来继续学习 Spring Boot GraphQL 实战,我们使用的框架是 https://github.com/graphql-java-ki ...

  6. Asp.Net中的三种分页方式

    Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...

  7. JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...

  8. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

  9. entity framework 数据加载三种方式的异同(延迟加载,预加载,显示加载)

    三种加载方式的区别 显示加载: 显示加载

  10. mybatis(三)懒加载

    懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为 ...

随机推荐

  1. Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法

    Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...

  2. step7: 输出到json文件

    调用scrapy自身的Exporter输出 编辑pipeline文件 import json from scrapy.exporters import JsonItemExporter #引入Expo ...

  3. 从零开始制作H5人脸融合小游戏

    去年的建军节,一个展示军装照的H5人脸融合游戏火遍朋友圈,带来很好的传播效果.最近欧冠决赛要来了,公司决定做一个寻找和你最像的欧冠球星的H5游戏,那么该怎么做呢?认真分析了一下,这个游戏其实用到的技术 ...

  4. 在Android下通过ExifInterface类操作图片的Exif信息

    什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...

  5. IE11 F12 开发人员工具 查看 Cookie

    参考网址:Using the F12 developer tools in IE11 Step1 : IE11 => F12 打开 开发人员工具 Step2:开发人员工具 => 网络F5 ...

  6. final 、finalize和finally的区别

    2019-04-1217:29:40 (1)final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.内部类要访问局部变量,局部变量必须定义成final类型,比如一段代码 (2) ...

  7. Java基础(八)异常处理

    一.异常 异常是指程序在运行过程产生的不正常情况.语法错误不算异常. 1.异常体系 Throwable:Java语言中所有错误或异常的超类:Throwable 类的子类有两个:1.Error:2.Ex ...

  8. Java基础(七)常用类

    一.Math类 1.Math类介绍 Math类属于java.lang包下面,里面包含用于执行基本数学运算的方法,如初等指数,对数,平方根和三角函数,该类被final修饰. 常用字段: 1.E 表示自然 ...

  9. C#学习笔记15

    1.平台互操作性和不安全的代码:C#功能强大,但有些时候,它的表现仍然有些“力不从心”,所以我们只能摒弃它所提供的所有安全性,转而退回到内存地址和指针的世界. C#通过3种方式对此提供支持. (1)第 ...

  10. c# 获取文件夹大小

    private long GetDirectorySizeMethod1(string directory) { long directorySize = 0; DirectoryInfo di = ...