ListView分页加载数据

ListView分页加载 在Android中是一个经常用到的技术,当我们需要加载大量的数据到列表显示时,假如一次性把所有数据加载完毕,可能会导致整个ListView列表卡顿,给用户的体验也非常不好。因而,我们可以将数据分为多次加载,每次加载其中的一部分,用户有需求的时候再加载其他部分,这样的设计会更加友好。

ListView分页原理

在日常开发中,我们可能会遇到以下两种情况:

  • 服务器支持分页请求,简单地说,比如,我们总共要请求100条数据,服务器支持我们每次请求N条数据,我们可以分100 / N 次请求完成,并且这些数据有一定的顺序,我们想请求第几页的数据就可以请求第几页的数据(这种情况下,我们可以实现真正的分页加载数据)。
  • 服务器不支持分布请求,我们没办法请求指定页的数据,只能一次性请求所有数据(这种情况下,我们只能自己处理,每次加载相应数目数据到ListView中)。

那么ListView分页原理就是,我们不一次性加载所有的数据,每次加载N条,然后我们监听ListView的滚动事件,当ListView滚动到最底部时,判定当前是否已加载完所有数据,如果未加载完毕,请求新一页的数据,直至所有的数据加载完成。

Demo实现

一般情况下,我们需要请求服务器的数据,但是这里我们只是要达到ListView分页加载的效果,我们自己模拟数据加载过程。
首先是我们的主页面MainActivity,其对应的页面文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.hotzhi.listviewtest.MainActivity"><ListViewandroid:id="@+id/lv_data"android:layout_width="match_parent"android:layout_height="match_parent"android:fastScrollEnabled="false"android:smoothScrollbar="true"android:cacheColorHint="#00000000"android:divider="#ffcccccc"android:dividerHeight="0.2dp" /></RelativeLayout>

这里没啥好介绍的,就只是一个ListView。接下来是,我们将ListView拖动到底部时,如果要加载新的数据,那么我们可以添加一个footerView,以更好的提示用户,下面是其布局文件,foot_view.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ffffff" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:baselineAligned="true"android:gravity="center|center_vertical"android:orientation="horizontal"android:paddingBottom="15dp"android:paddingTop="15dp" ><ProgressBarandroid:id="@+id/progressBar_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:gravity="center"style="?android:attr/progressBarStyleSmall"android:paddingBottom="2dp"android:paddingTop="2dp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"android:gravity="center"android:text="加载更多中……"android:textSize="13sp" /></LinearLayout></FrameLayout>

也非常简单,就一个加载框,然后一个提示文本。
下面就是我们的具体实现了,MainActivity.java

package com.hotzhi.listviewtest;import android.os.Bundle;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {/** 列表翻页每页加载数目 */private static final int ONE_PAGE_ITEM_COUNT = 20;// 由于这里是测试数据,我们自己控制所有数据请求的结束位置,也就是页数达到MAX_PAGE无法再次请求数据。/** 最大页数(测试) */private static final int MAX_PAGE = 8;private List<String> lstData = new ArrayList<>();private ArrayAdapter<String> mAdapter;private ListView lvData;/** 当前页码 */public int iCurPageIndex = 0;/** 列表第一项 */private int firstItem;/** 列表可见项 */private int visibleItem;/** 列表可见项 */private int totalItem;/** 是否可以上拉 */private boolean canUpPull = true;/** 是否正在加载 */private boolean isLoading = false;/** 页脚布局 */private FrameLayout mFooterView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViews();setListeners();initData();}private void findViews() {lvData = (ListView) findViewById(R.id.lv_data);mFooterView = (FrameLayout) LayoutInflater.from(this).inflate(R.layout.foot_view, null);}private void setListeners() {lvData.setOnScrollListener(onScrollListener);}private void initData() {requestData();}/*** ListView滚动监听器*/private AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (firstItem + visibleItem == totalItem) {// 当前处于不可上拉加载状态,不可继续请求数据if(!canUpPull) {return ;}// 数据正在加载,不可继续请求if(isLoading) {return ;}lvData.addFooterView(mFooterView);lvData.setSelection(lvData.getBottom());isLoading = true;iCurPageIndex++;requestData();}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {firstItem = firstVisibleItem;visibleItem = visibleItemCount;totalItem = totalItemCount;}};/*** 请求加载更多数据* 如,请求服务器数据*/private void requestData() {// 这里我们休眠3秒钟,相当于3秒钟后数据才加载完毕// 当然我们在实际项目中可能不需要休眠处理,直接请求数据等待数据返回即可。new Thread() {public void run() {try {Thread.sleep(3000);// 主线程中加载数据handler.sendEmptyMessage(0);} catch (InterruptedException e) {e.printStackTrace();}}}.start();}private android.os.Handler handler = new android.os.Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);// 加载数据// 加载第iCurPageIndex页数据for(int i = iCurPageIndex * ONE_PAGE_ITEM_COUNT; i < (iCurPageIndex + 1) * ONE_PAGE_ITEM_COUNT; i++) {lstData.add("第" + i + "条数据");}// 数据加载完毕设置相应标志isLoading = false;canUpPull = true;lvData.removeFooterView(mFooterView);// 这里我们通过判断加载页位置与最大可加载页比较判断,是否已加载完所有数据if(iCurPageIndex >= MAX_PAGE) {canUpPull = false;if(iCurPageIndex > 0) {Toast.makeText(MainActivity.this, "已到达最后一页!", Toast.LENGTH_SHORT).show();}}if(mAdapter == null) {mAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, lstData);lvData.setAdapter(mAdapter);} else {mAdapter.notifyDataSetChanged();}}};
}

ListView分页加载数据相关推荐

  1. 分组显示的ListView分页加载数据

    参考:  http://www.cnblogs.com/qianxudetianxia/archive/2011/06/07/2074326.html 分组的ListView的拖拽  http://w ...

  2. Android中ListView分页加载数据

    熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容 ...

  3. listView分批和分页加载数据

    在Android应用程序中,有时候会向listView中加载很多数据,向listView中加载数据是一个耗时的过程,加载过多的数据用户停留在listView上,一直等待,给用户的体验特别不好,比如向服 ...

  4. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  5. 微信小程序数据拼接_最佳方式实现微信小程序分页加载数据

    一般小程序做分页加载数据,会做一些下拉加载更多.然后上拉刷新的操作.数据放在一个for循环里去加载,数据源是一个数组对象.在加载下一页数据时,将下一页的数据拼到当前数组后面.这样的确可以实现分页加载数 ...

  6. 小程序下滑分页加载数据

    小程序下滑分页加载数据 1. 在data定义page参数 params: {pageNum: 1,pageSize: 10,total: 0,searchValue: ''}, 2. 请求接口数据 g ...

  7. Android GridView横向滚动,分页加载数据

    转载请注明出处,谢谢http://blog.csdn.net/harryweasley/article/details/51007348 始终觉得讲ui效果要先放上效果图,要不让其他人好不容易看完了, ...

  8. 微信小程序 实现分页加载数据

    实现分页加载数据要用到页面加载触底事件 onReachBottom: function () { } 首先在 js 定义初始数据 data: { //用来接收后端数据list:[], //当前页cur ...

  9. List 分页加载数据控制机制

    分页加载是一种应用很广泛的数据展示控制机制,相信绝大多数开发者对于这一套机制都非常熟悉.这篇文章的主要目的结合实际的使用场景,对以往在开发中遇到一些概念进行梳理,归纳的同时加深理解,也希望能帮助更多刚 ...

  10. extjs combobox分页加载数据不显示

    在加一个事件之前是对的可以加载,但是在添加一个事件之后,不可显示了,以下是错误的代码 /** * YHC */ /** * 分页的Combobox */ PagingMedicalcareCbo=Ex ...

最新文章

  1. Ubuntu 12.04 64bit上安装Apache Traffic Server 4.1.2
  2. 【整理】SYSCOMMAND的wParam值的宏定义
  3. 进销存设计之——单据的数据表结构设计
  4. 行列式运算算法c语言,新手作品:行列式计算C语言版
  5. 配置VLAN以及配置VTP;
  6. 出发a标签_以用户标签为例,复盘B端产品的需求挖掘方法论
  7. 12.Bridge-桥接模式
  8. CyaSSL 2.4.6 发布,SSL 加密库
  9. 2.2. MongoDB 管理
  10. 批量查看域用户登录计算机信息
  11. Windows核心编程_判断是否管理员权限运行
  12. 调查:Blackberry开发者中国大版图
  13. C++程序设计一(进制转换)
  14. 三层架构(命名规则)
  15. 计算机财会属于经济管理类吗,哪些专业可以考公务员
  16. 华佳慧科技:OSN500设备的RPLCUR性能事件
  17. No realms have been configured! One or more realms must be present to execut
  18. 短文阅读1:Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate
  19. python开发app-如何用python写一个安卓APP?(上)
  20. openstack 使用iscsi连接网盘并提供cinder存储服务

热门文章

  1. 韩文、日语相关 文档扫描识别 的福音
  2. 虚拟机客户端访问不了服务器域名,虚拟机ESXI 篇四:让你电脑打开网页不用等待---SmartDns...
  3. c++实现串口功能之termios.h头文件研读<二>
  4. 入门软件测试--功能测试
  5. Linux打卡第二天
  6. 蓝桥杯真题 日期问题 c++代码实现 小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。
  7. C语言如何生成随机数
  8. Autoware安装使用教程
  9. 二分类模型评价指标-AUC
  10. 求素数 java 101 200_Java求101~200之间的素数