一、ListView分页:
(一)、目的:
         Android 应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过 分页的形式来展示数据,这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑 动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。
(二)、核心技术点:
  1. 借助 ListView组件的OnScrollListener监听事件,去判断何时该加载新数据;
  2. 往服务器get传递表示页码的参数:page。而该page会每加载一屏数据后自动加一;
  3. 利用addAll()方法不断往list集合末端添加新数据,使得适配器的数据源每新加载一屏数据就发生变化;
  4. 利用适配器对象的notifyDataSetChanged()方法。该方法的作用是通知适配器自己及与该数据有关的view,数据已经发生变动,要刷新自己、更新数据。
(三)、 OnScrollListener监听事件 :
1、该监听器中有两个需要实现的方法:
  • onScrollStateChanged(AbsListView view, int scrollState):监听屏幕的滚动状态的变动情况
  • onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount):监听屏幕滚动的item的数量
2、 scrollState 回调顺序如下: 
  • 第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1):表示正在滚动。当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1
  • 第2次:scrollState =SCROLL_STATE_FLING(2) :表示手指做了抛的动作(手指离开屏幕前,用力滑了一下,屏幕产生惯性滑动)。
  • 第3次:scrollState =SCROLL_STATE_IDLE(0) :表示屏幕已停止。屏幕停止滚动时为0。
3、 onScroll中参数讲解:
  • firstVisibleItem:当前窗口中能看见的第一个列表项ID(从0开始)
  • visibleItemCount:当前窗口中能看见的列表项的个数(小半个也算)
  • totalItemCount:列表项的总数
4、思路:

  • 当滚到最后一条,加载新数据;
  • 适配器的数据源要进行累加:totalList.addAll(list);
  • 数据发生变化,适配器通知:adapter.notifyDataSetChanged();【牢记】
  • 判断是否滚到最后一行。
示例代码:
if (firstVisibleItem + visibleItemCount == totalItemCount ) {    
isBottom = true; 
}

(四)、页面效果:

【要求:】
当屏幕滑动到最后一条时,显示“点击加载数据”的提示。点击后可以加载新的数据。当向上滑动或者没有到最后一条时,不显示“点击加载数据”的提示。
(五)、核心代码:
1、布局文件的核心代码:

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<ListView

android:id="@+id/listView_main"

android:layout_below="@+id/button_main_init"

android:layout_width="match_parent"

android:layout_height="match_parent">

</ListView>

<LinearLayout

android:id="@+id/layout_main_nextpage"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:background="#000"

android:visibility="invisible"

android:gravity="center"

android:onClick="clickButton"

android:padding="5dp">

<ProgressBar

android:id="@+id/progressBar_main"

style="?android:attr/progressBarStyleSmall"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

<TextView

android:id="@+id/text_main_nextpage"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="10dp"

android:textSize="18sp"

android:onClick="clickButton"

android:textColor="#fff"

android:text="点击加载更多数据"/>

</LinearLayout>

</RelativeLayout>

2、Activity页面核心代码:

publicclass MainActivity extends Activity {

privateStringTAG= "MainActivity";

privateListView listView_main;

privateLinearLayout layout_main_nextpage;

private MySQLiteDatabaseHelper dbHelper = null;

// 用于分页显示数据的属性

privateintpageSize= 30;// 每页显示的条数

privateintcurPage= 1;

privateintrowCount= 0;

privateintpageCount= 0;// 总页数

privatebooleanisBottom=false;// 判断是否滚动到数据最后一条

private List<Map<String, Object>> totalList = null;// 加载到适配器中的数据源

private SimpleAdapter adapter = null;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listView_main = (ListView) findViewById(R.id.listView_main);

layout_main_nextpage = (LinearLayout) findViewById(R.id.layout_main_nextpage);

// 实例化访问数据库帮助类

dbHelper = new MySQLiteDatabaseHelper();

// 获取数据表一共有多少条,从而计算共有多少页

rowCount=dbHelper.selectCount("select id from android_basic",null);

// 计算总页码数

pageCount = (int) Math.ceil(rowCount / (float) pageSize);

// 如果当前页为第一页,则数据源集合中就是第一页的内容

if (curPage == 1) {

totalList = getCurpageList(1);

}

adapter = new SimpleAdapter(this, totalList,

R.layout.item_listview_mainnew String[] { "_id", "title" },

newint[] { R.id.text_item_listview_id,

R.id.text_item_listview_title});

listView_main.setAdapter(adapter);

// 给ListView对象设置滚动监听器,以此来判断是否已经滚动到最后一条,从而决定是否加载新数据

listView_main.setOnScrollListener(new OnScrollListener() {

@Override

publicvoid onScrollStateChanged(AbsListView view, int scrollState) {

if (isBottom) {

// 如果滚到最后一条数据(即:屏幕最底端),则显示:“加载更多新数据”

if(curPage < pageCount) {

layout_main_nextpage.setVisibility(View.VISIBLE);

}

else {

layout_main_nextpage.setVisibility(View.GONE);

}

}

@Override

publicvoid onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

// Log.i(TAG, "==" + firstVisibleItem + ":::" + visibleItemCount

// + ":::" + totalItemCount);

// 判断是否已经滚动到了最后一条,从而决定是否提示加载新数据

isBottom = (firstVisibleItem + visibleItemCount == totalItemCount);

}

});

}

publicvoid clickButton(View view) {

switch (view.getId()) {

caseR.id.layout_main_nextpage:

// Log.i(TAG, "==" + curPage + ":::" + pageCount);

// 如果不是最后一页,则让当前页码累加,让数据源累加新数据,并通知适配器信息发生变化

if(curPage < pageCount) {

curPage++;

totalList.addAll(getCurpageList(curPage));

adapter.notifyDataSetChanged();

}

// 只要点击了提示“加载新数据”的信息,就让其隐藏

layout_main_nextpage.setVisibility(View.GONE);

break;

default:

break;

}

}

// 获取每一页的数据,返回List集合

private List<Map<String, Object>> getCurpageList(int currentPage) {

int offset = (currentPage - 1) * pageSize;

String sql = "select id _id ,title from android_basic limit ? , ?";

returndbHelper.selectData(sql, new String[] { offset + "",

pageSize + "" });

}

ListView分页详解(非常有用)相关推荐

  1. 宏锦软件 Android 的 ListView 使用详解

     宏锦软件爱好者在开发Android软件时,对ListView的使用有点陌生,于是翻了许多资料,这里给大家一份比较好的教程,希望有用. 在android开发中ListView是比较常用的组件,它以 ...

  2. ASP.NET技巧:GridView控件自定义分页详解第一页

    ASP.NET技巧:GridView控件自定义分页详解 日期:2007年9月11日 作者: 查看:[大字体 中字体 小字体] <script src="../gg/info468.js ...

  3. GridView分页详解

    本次使用GridView是工厂模式下  无极限分类 GridView详解 1.GridView前台分析 2.GridView分页讲解 3.GridView绑定,编辑,更新,取消,删除,排序  Grid ...

  4. sql server与oracle的分页,详解SQLServer和Oracle的分页查询

    不管是DRP中的分页查询代码的实现还是面试题中看到的关于分页查询的考察,都给我一个提示:分页查询是重要的.当数据量大的时候是必须考虑的.之前一直没有花时间停下来好好总结这里.现在又将Oracle视频中 ...

  5. ListView.getChildCount() 详解

    ListView.getCount() 返回的所包含的item总个数 ListView.getChildCount() (ViewGroup.getChildCount()) 返回的是显示层面上所包含 ...

  6. jquery easyui datagrid 分页 详解

    http://www.cnblogs.com/huozhicheng/archive/2011/09/27/2193605.html 由于项目原因,用了jquery easyui 感觉界面不错,皮肤样 ...

  7. C# WINFORM ListView用法详解(转)

    源代码下载位置: http://pan.baidu.com/s/1qXrLehe 一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false ...

  8. Lodop 分页详解,可详细了呢

    首先我们在打印之前数据肯定是要准备好的,首先把标题 题头等信息准备好,然后循环列表采用json串的方式,这样方便遍历和修改 直接把list转换成json,然后赋值给一个对象的某个属性.这样前台就可以直 ...

  9. ssm mysql动态分页_SSM项目手动分页详解

    环境:idea+mysql 首先,既然是mysql,那肯定会用到limit,用这个分页的确很方便. 第一步,编写sql语句 1 2 SELECT3 *4 FROM5 image6 7 8 status ...

最新文章

  1. JavaScript去除字符串首尾空格
  2. Python学习之datetime时间戳
  3. (待完成)qbxt2019.05 总结2 - 数位DP
  4. 杀鸡焉用牛刀!放下Windbg,让dotnet-stack来快速定位死锁原因
  5. 【今日CV 视觉论文速览】27 Nov 2018
  6. PHP地图规划骑行路径,骑行路线规划-路线规划-开发指南-iOS 导航SDK | 高德地图API...
  7. ACM将一个十进制的数转换为一个十六进制的数输出
  8. go mod 几个常用命令
  9. 多线程程序中操作的原子性--转帖
  10. 【不积跬步,无以致千里】DELETE SINGLE IPTABLES RULES
  11. 在线 pdf转word
  12. Android开发EasyAr初试
  13. python里面的pip是什么意思_为什么您应该使用`python -m pip`
  14. 『WIN11』出现问题,你的PIN不可用,请重置PIN,无限循环解决
  15. python计算时间差的方法_如何计算时间差,用Python算法的话
  16. Resources Root目录和Sources Root目录的区别
  17. 基于电商直播SDK快速实现一个淘宝直播APP【内附源码】
  18. Python语言程序设计 (第11期) 测验6: 组合数据类型
  19. 在这个互联网加的时代,我们能做些什么呢?
  20. python中的数据过滤

热门文章

  1. return true return false 的区别
  2. 正则表达式中的g是什么意思
  3. 机器学习——基于M-distance的推荐
  4. 智能优化算法之 差分进化算法
  5. java实现在图片上插入文字并保存。
  6. 计算机的硬件故障维修,计算机硬件故障分析与解决方法
  7. java aes加密 base64_【java】AES加密解密|及Base64的使用
  8. PostgreSQL主从数据库数据同步
  9. SQL语法大全中文版
  10. 【STM8L】STM8L之timer2产生PWM