Android数据分批载入-滑动究竟部自己主动载入列表
Android数据分批载入-滑动究竟部自己主动载入列表
2014年5月9日
摘自:《Android高级开发实战—ui、ndk与安全》
本博文介绍怎样进行数据分批载入,在应用开发其中会常常使用到ListView。点击很多其它载入数据是我们常常简单,为了提供用户体验。当用户将列表滚动究竟部自己主动载入数据。这种形式用得比較多。
以下给大家提供的样例是,每次模拟20条数据,滑动究竟部时再请求20条数据直到请求到限定页数为止
详细代码实现:
/08_Datapageload/src/com/wwj/datapageload/MainActivity.java
package com.wwj.datapageload; import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListView; public class MainActivity extends Activity {
private ListView listView;
private List<String> data = new ArrayList<String>();
ArrayAdapter<String> adapter;
View footer; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
footer = getLayoutInflater().inflate(R.layout.footer, null); listView = (ListView) findViewById(R.id.listView);
listView.setOnScrollListener(new ScrollListener()); // 模拟数据
data.addAll(DataService.getData(0, 20));
adapter = new ArrayAdapter<String>(this, R.layout.listview_item,
R.id.textView, data);
listView.addFooterView(footer);// 加入页脚(放在ListView最后)
listView.setAdapter(adapter);
listView.removeFooterView(footer);
} private int number = 20; // 每次获取多少条数据
private int maxpage = 5; // 总共同拥有多少页
private boolean loadfinish = true; // 指示数据是否载入完毕 private final class ScrollListener implements OnScrollListener { @Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
Log.i("MainActivity", "onScroll(firstVisibleItem="
+ firstVisibleItem + ",visibleItemCount="
+ visibleItemCount + ",totalItemCount=" + totalItemCount
+ ")"); final int loadtotal = totalItemCount;
int lastItemid = listView.getLastVisiblePosition(); // 获取当前屏幕最后Item的ID
if ((lastItemid + 1) == totalItemCount) { // 达到数据的最后一条记录
if (totalItemCount > 0) {
// 当前页
int currentpage = totalItemCount % number == 0 ? totalItemCount
/ number
: totalItemCount / number + 1;
int nextpage = currentpage + 1; // 下一页
if (nextpage <= maxpage && loadfinish) {
loadfinish = false;
listView.addFooterView(footer); // 开一个线程载入数据
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
List<String> result = DataService.getData(
loadtotal, number);
// 发送消息
handler.sendMessage(handler.obtainMessage(100,
data));
}
}).start();
}
}
} } @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i("MainActivity", "onScrollStateChanged(scrollState="
+ scrollState + ")");
} } private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
data.addAll((List<String>) msg.obj);
// 告诉ListView数据已经发生改变。要求ListView更新界面显示
adapter.notifyDataSetChanged();
if (listView.getFooterViewsCount() > 0) { // 假设有底部视图
listView.removeFooterView(footer);
}
loadfinish = true; // 载入完毕
};
}; }
/08_Datapageload/src/com/wwj/datapageload/DataService.java
package com.wwj.datapageload; import java.util.ArrayList;
import java.util.List; public class DataService {
public static List<String> getData(int offset, int maxResult) { // 分页limit
// 0,20
List<String> data = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
data.add("ListView数据的分批载入" + i);
}
return data; }
}
效果图例如以下:
Android数据分批载入-滑动究竟部自己主动载入列表的更多相关文章
- [JS前端开发] js/jquery控制页面动态载入数据 滑动滚动栏自己主动载入事件
本人小菜鸟一仅仅.为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群.希望光临本博客的人能够进来交流.寻求 ...
- 让Android Support V4中的SwipeRefreshLayout支持上拉载入很多其它
前言 原来的Android SDK中并没有下拉刷新组件,可是这个组件确实绝大多数APP必备的一个部件.好在google在v4包中出了一个SwipeRefreshLayout.可是这个组件仅仅支持下拉刷 ...
- Android实现RecyclerView的下拉刷新和上拉载入很多其它
需求 先上效果图, Material Design风格的下拉刷新和上拉载入很多其它. 源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2 假设对于 ...
- Android三种左右滑动效果 手势识别
Android三种左右滑动效果 手势识别(转) 手势识别 1.onCreate中添加GestureDetector mGestureDetector; //监听手势事件 mGestureDetec ...
- TabTopAutoLayout【自定义顶部选项卡区域(带下划线)(动态选项卡数据且可滑动)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现带下划线且可滑动效果.[实际情况中建议使用RecyclerView] 备注:如果 ...
- TabTopAutoTextSizeLayout【自定义文字字号区域(动态选项卡数据且可滑动)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现可滑动效果.[实际情况中建议使用RecyclerView] 对<TabTo ...
- (七十一)关于UITableView退出崩溃的问题和滚动究竟部的方法
[TableView退出崩溃的问题] 近期在使用TableView时偶然发如今TableView中数据较多时,假设在滚动过程中退出TableView到上一界面.会引起程序的崩溃.经过网上查阅和思考我发 ...
- Android数据存储之SQLCipher数据库加密
前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...
- Android数据存储之GreenDao 3.0 详解
前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...
随机推荐
- 使用剩余参数代替 arguments (prefer-rest-params)
使用剩余参数代替 arguments (prefer-rest-params) 剩余参数来自于ES2016.可以在可变函数中使用这个特性来替代arguments变量. arguments没有Array ...
- -bash: wget 未找到命令的解决办法
在Linux操作系统中,我们会经常要用到wget下载文件.wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性. 在linux中使用wget时,若报-bash: wget: comman ...
- Tokyo Tyrant(TTServer)系列(二)-启动參数和配置
启动參数介绍 ttserver命令能够启动一个数据库实例.由于数据库已经实现了Tokyo Cabinet的抽象API,所以能够在启动的时候指定数据库的配置类型. 支持的数据库类型有: ...
- LeetCode——Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...
- C++ 虚函数的缺省參数问题
前些日子,有个同学问我一个关于虚函数的缺省參数问题.他是从某个论坛上看到的.可是自己没想通.便来找我. 如今分享一下这个问题.先看一小段代码: #include <iostream> us ...
- [jzoj NOIP2018模拟10.29]
OI生涯的最高分,来了纪中这么多天,在经历了这么多场“NOIP难度”的模拟赛之后,终于看到了真正的NOIP 今天考场上效率很高,很快码完了全部的题目,留下了足够的时间对拍和...发呆.不得不说看着电脑 ...
- AngularJS1 学习笔记1
什么是 AngularJS? AngularJS 使得开发现代的单一页面应用程序(SPAs:Single Page Applications)变得更加容易. AngularJS 把应用程序数据绑定到 ...
- 27.boost多线程
#define _CRT_SECURE_NO_WARNINGS #include <boost/thread.hpp> #include <iostream> #include ...
- BZOJ 3166 set+可持久化trie树(OR 莫队)
思路: 1.找次大值 我们不妨设当前点是次大的 那这段区间为 左边第二个比它大的点的坐标+1 和右边第二个比它大的点的坐标-1 2.用可持久化trie树找异或最大值 也可以用莫队 //By Siriu ...
- 在CentOS下安装tomcat并配置环境变量(改默认端口8080为8081)
不多说,直接上干货! 第一步:下载tomcat压缩包 http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.73/bin/ 第二步:上传tomcat压 ...