一、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、布局文件的核心代码:

<RelativeLayout xmlns: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页面核心代码:

public class MainActivity extends Activity {

private String TAG = "MainActivity";

private ListView listView_main;

private LinearLayout layout_main_nextpage;

private MySQLiteDatabaseHelper dbHelper = null;

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

private int pageSize = 30;// 每页显示的条数

private int curPage = 1;

private int rowCount = 0;

private int pageCount = 0;// 总页数

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

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

private SimpleAdapter adapter = null;

@Override

protected void 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_main, new String[] { "_id", "title" },

new int[] { R.id.text_item_listview_id,

R.id.text_item_listview_title });

listView_main.setAdapter(adapter);

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

listView_main.setOnScrollListener(new OnScrollListener() {

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

if (isBottom) {

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

if (curPage < pageCount) {

layout_main_nextpage.setVisibility(View.VISIBLE);

}

} else {

layout_main_nextpage.setVisibility(View.GONE);

}

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

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

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

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

isBottom = (firstVisibleItem + visibleItemCount == totalItemCount);

}

});

}

public void clickButton(View view) {

switch (view.getId()) {

case R.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 ? , ?";

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

pageSize + "" });

}

Android15_ListView分页相关推荐

  1. 手把手教你JavaEE的分页查询、分页展示,有了这个,你的项目又多了一个谈资

    前言: 我们在写项目的时候,往往有一些项目的信息展示.而展示的数据量往往是很大的,这时候,加入一个分页的功能往往是最理想的选择. 先简单描述一下功能: 根据你的数据量和指定的页面展示数据条数,进行查询 ...

  2. django自带的分页功能

    django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...

  3. Mysql分页order by数据错乱重复

    公司用的是Mybatis,发现分页和排序时直接传递参数占位符用的都是 ,由于,由于,由于有SQL注入风险,要改为#,但是封装page类又麻烦,所以直接使用了 pageHelper 插件了,方便快捷,但 ...

  4. Django 分页和使用Ajax5.3

    分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据, ...

  5. [JAVA EE] JPA 查询用法:自定义查询,分页查询

    项目已上传:https://codechina.csdn.net/qq_36286039/javaee 自定义查询 问题:内置的crud功能不满足需求时如何添加自定义查询? 几种自定义查询方法 方法命 ...

  6. datatable java实现分页_jQuery Datatable - 使用Php的服务器端处理数据分页

    我有jquery datatable分页的问题(服务器端处理) . 例如,我在数据库中有 24 条记录 . 计数正确显示,总分页也正确显示 . 当我点击 Next or 2nd page 时,它会根据 ...

  7. Oracle分页存储过程

    CREATE OR REPLACE Procedure Soa_Getpager(p_Pagesize Int, --每页记录数p_Pageno Int, --当前页码,从 1 开始p_Sqlcols ...

  8. mybaties分页

    首先引入jar包: <dependency><groupId>com.github.pagehelper</groupId><artifactId>pa ...

  9. Jquery前端分页插件pagination同步加载和异步加载

    上一篇文章介绍了Jquery前端分页插件pagination的基本使用方法和使用案例,大致原理就是一次性加载所有的数据再分页.https://www.jianshu.com/p/a1b8b1db025 ...

  10. webform(七)分页

    分页就是把大量数据分成X个/组,每次只显示一组数据的数据展示方式. 前端代码: <%@ Page Language="C#" AutoEventWireup="tr ...

最新文章

  1. php测试网络通不通函数,PHP检查库或函数是否可用的方法
  2. Android的四大组件
  3. python画熊猫论文_Python数据可视化之美:专业图表绘制指南(全彩)
  4. 2021未来职业规划以及对过去的总结
  5. python将字符串写入csv_用Python将字符串值写入CSV文件
  6. uniapp中自定义导航栏动态获取高度
  7. html中a标签根据一个参数跳转不同的页面
  8. 【Elasticsearch】搜索引擎从0到1 有赞 视频笔记
  9. Django Ajax发送请求使用方法
  10. oracle的三个网络配置文件
  11. zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED
  12. 无需Docker, 5分钟徒手DIY 一个Linux容器
  13. 北京大学生物信息学 (4)序列数据库
  14. 读《自己动手写操作系统》
  15. 金庸群侠传苍龙逐日1.2-szlzw手机移植版攻略
  16. 怎样写毕业论文的开题报告和任务书?
  17. Xshell上传文件到Ubuntu服务器
  18. Java使用Lambda表达式多字段求和
  19. OpenStack------Placement组件部署
  20. 机器学习中的数学(上)

热门文章

  1. 多目标跟踪算法 | FairMOT
  2. 白话讲解RPC调用和HTTP调用的区别
  3. 冷高轮时间 小人人体形状造型 手势 麻将 扑克 数字时钟APP android安卓版本/iOS苹果版本
  4. 字节跳动“蚕食”B端,搅局企业服务?
  5. tp5 点击刷新验证码
  6. 可展开和收起的LinearLayout
  7. 2018年4月自考感想
  8. 思维导图怎么画简单又漂亮?思维导图制作方法分享
  9. VS2019插件VSIX开发
  10. oracle的windows用户名,oracle数据库建立后,用户名跟密码设置windows平台