上一节我们实现了数据表的载入,可是,当数据表数据非常多时。我们就要考虑数据的分页。这里我们选用了PullToRefreshListView控件,先看一下该控件的说明:

效果图: 

                               正在刷新                                                                       刷新后

      

一、导入Library

下载源代码后(https://github.com/chrisbanes/Android-PullToRefresh),里面有个Libraryproject,加入project到Eclipse中;

另外extras目录还有两个project:PullToRefreshListFragment和PullToRefreshViewPager,因为我们的这个用不到他们的库文件,所以不必导入了。

二、实战

1、新建project,加入Libray库到project中

新建project(try_PullToRefresh)后,右键-》Properties-》Android-》Add  选择上面的Library,然后就是这个样子的

2、重写activity_main.xml

XML内容为:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <!--     The PullToRefreshListView replaces a standard ListView widget. -->
  7. <com.handmark.pulltorefresh.library.PullToRefreshListView
  8. android:id="@+id/pull_refresh_list"
  9. android:layout_width="fill_parent"
  10. android:layout_height="fill_parent"
  11. android:cacheColorHint="#00000000"
  12. android:divider="#19000000"
  13. android:dividerHeight="4dp"
  14. android:fadingEdge="none"
  15. android:fastScrollEnabled="false"
  16. android:footerDividersEnabled="false"
  17. android:headerDividersEnabled="false"
  18. android:smoothScrollbar="true" />
  19. </LinearLayout>

当中中间那一大段<com.handmark.pull………………/>就是相当于ListView控件,用这段来取代原是ListView控件的代码

以下我们看一下详细怎么实现的。

先在数据表中插入数据:

然后看代码。MainActivity.java:

package com.bmob.pagingdemo;

import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import cn.bmob.v3.Bmob;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.listener.FindListener; import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2;
import com.handmark.pulltorefresh.library.PullToRefreshListView; public class MainActivity extends Activity { PullToRefreshListView mPullToRefreshView;
private ILoadingLayout loadingLayout;
ListView mMsgListView;
List<TestData> bankCards = new ArrayList<TestData>();// 数据list private static final int STATE_REFRESH = 0;// 下拉刷新
private static final int STATE_MORE = 1;// 载入很多其它 private int limit = 10; // 每页的数据是10条
private int curPage = 0; // 当前页的编号。从0開始 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Bmob.initialize(this, "8f3ffb2658d8a3366a70a0b0ca0b71b2");// 初始化
queryData(0, STATE_REFRESH); initListView();// 初始化ListView
} private void initListView() {
mPullToRefreshView = (PullToRefreshListView) findViewById(R.id.list);
loadingLayout = mPullToRefreshView.getLoadingLayoutProxy();
loadingLayout.setLastUpdatedLabel("");
loadingLayout
.setPullLabel(getString(R.string.pull_to_refresh_bottom_pull));// 下拉标签
loadingLayout
.setRefreshingLabel(getString(R.string.pull_to_refresh_bottom_refreshing));// 刷新标签
loadingLayout
.setReleaseLabel(getString(R.string.pull_to_refresh_bottom_release));// 释放标签
// //滑动监听
mPullToRefreshView.setOnScrollListener(new OnScrollListener() { @Override
public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) { if (firstVisibleItem == 0) {
loadingLayout.setLastUpdatedLabel("");
loadingLayout
.setPullLabel(getString(R.string.pull_to_refresh_top_pull));
loadingLayout
.setRefreshingLabel(getString(R.string.pull_to_refresh_top_refreshing));
loadingLayout
.setReleaseLabel(getString(R.string.pull_to_refresh_top_release));
} else if (firstVisibleItem + visibleItemCount + 1 == totalItemCount) {// 载入完成
loadingLayout.setLastUpdatedLabel("");
loadingLayout
.setPullLabel(getString(R.string.pull_to_refresh_bottom_pull));
loadingLayout
.setRefreshingLabel(getString(R.string.pull_to_refresh_bottom_refreshing));
loadingLayout
.setReleaseLabel(getString(R.string.pull_to_refresh_bottom_release));
}
}
}); // 下拉刷新监听
mPullToRefreshView
.setOnRefreshListener(new OnRefreshListener2<ListView>() { @Override
public void onPullDownToRefresh(
PullToRefreshBase<ListView> refreshView) {
// 下拉刷新(从第一页開始装载数据)
queryData(0, STATE_REFRESH);
} @Override
public void onPullUpToRefresh(
PullToRefreshBase<ListView> refreshView) {
// 上拉载入很多其它(载入下一页数据)
queryData(curPage, STATE_MORE);
}
}); mMsgListView = mPullToRefreshView.getRefreshableView();
// 再设置adapter
mMsgListView.setAdapter(new DeviceListAdapter(this));
} /**
* 分页获取数据
*
* @param page
* 页码
* @param actionType
* ListView的操作类型(下拉刷新、上拉载入很多其它)
*/
private void queryData(final int page, final int actionType) {
Log.i("bmob", "pageN:" + page + " limit:" + limit + " actionType:"
+ actionType); BmobQuery<TestData> query = new BmobQuery<TestData>();
query.setLimit(limit); // 设置每页多少条数据
query.setSkip(page * limit); // 从第几条数据開始,
query.findObjects(this, new FindListener<TestData>() { @Override
public void onSuccess(List<TestData> arg0) {
// TODO Auto-generated method stub if (arg0.size() > 0) {//能载入到数据
if (actionType == STATE_REFRESH) {
// 当是下拉刷新操作时,将当前页的编号重置为0。并把bankCards清空,又一次加入
curPage = 0;
bankCards.clear();
} // 将本次查询的数据加入到bankCards中
for (TestData td : arg0) {
bankCards.add(td);
} // 这里在每次载入完数据后。将当前页码+1。这样在上拉刷新的onPullUpToRefresh方法中就不须要操作curPage了
curPage++;
showToast("第" + (page + 1) + "页数据载入完成");
} else if (actionType == STATE_MORE) {//数据载入完成
showToast("没有很多其它数据了");
} else if (actionType == STATE_REFRESH) {//无数据
showToast("没有数据");
}
mPullToRefreshView.onRefreshComplete();
} @Override
public void onError(int arg0, String arg1) {
// TODO Auto-generated method stub
showToast("查询失败:" + arg1);
mPullToRefreshView.onRefreshComplete();
}
});
} /**
* Adapter
*
* @author Administrator
*
*/
private class DeviceListAdapter extends BaseAdapter { Context context; public DeviceListAdapter(Context context) {
this.context = context;
} @Override
public View getView(final int position, View convertView,
ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) { convertView = LayoutInflater.from(context).inflate(
R.layout.list_item_bankcard, null);
holder = new ViewHolder();
holder.tv_cardNumber = (TextView) convertView
.findViewById(R.id.tv_cardNumber);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
} TestData td = (TestData) getItem(position); holder.tv_cardNumber.setText(td.getName());
return convertView;
} class ViewHolder {
TextView tv_cardNumber;
} @Override
public int getCount() {
return bankCards.size();
} @Override
public Object getItem(int position) {
return bankCards.get(position);
} @Override
public long getItemId(int position) {
return position;
} } private void showToast(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
} }

TestData.java:

package com.bmob.pagingdemo;

import cn.bmob.v3.BmobObject;

public class TestData extends BmobObject {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

main.xml:

<LinearLayout 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:orientation="vertical" > <com.handmark.pulltorefresh.library.PullToRefreshListView
xmlns:ptr="http://schemas.android.com/apk/res/com.bmob.pagingdemo"
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="none"
android:fastScrollEnabled="false"
android:smoothScrollbar="true"
ptr:ptrMode="both" /> </LinearLayout>

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bmob.pagingdemo"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- 同意应用打开网络套接口 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

执行实例。下拉刷新:

上拉载入,每次载入10条数据:

本实例有个问题,初次进入时不能载入数据。必须下拉才干载入数据,请能找出问题的朋友联系我:291214603。多谢。

喜欢的朋友能够关注我。谢谢!

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉载入实现!)的更多相关文章

  1. Android实战简易教程-第二十四枪(基于Baas的用户表查询功能实现!)

    接着上一篇,我们注冊了几个用户,用户表例如以下: 以下我们用ListView将表中数据显示出来吧. 首先看一下main.xml: <RelativeLayout xmlns:android=&q ...

  2. Android实战简易教程-第二十八枪(Uri转String型实例)

    接上一篇文章.我们能够轻易的获取所选图片的uri,那么我们考虑怎样将获取的uri转换成String型的地址呢? 接下来我们通过实例来研究.布局文件和上篇(二十七枪)一致,我们就不再列出,直接看Main ...

  3. Android实战简易教程-第十五枪(实现ListView中Button点击事件监听)

    1.main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...

  4. Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)

    上一篇我们介绍了怎样由uri转换成String ,本文就用到了上篇文章的方法.以下我们介绍一下怎样设置头像后将头像图片上传到云端的方法,本文基于Bmob提供的服务. 看一下代码:(布局文件和前两篇文章 ...

  5. Android实战简易教程-第二十六枪(基于ViewPager实现微信页面切换效果)

    1.头部布局文件top.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  6. Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)

    接上一篇,加入验证用户名是否已经注冊功能! 仅仅须要改动MainActivity.java: package com.example.logintest; import java.util.List; ...

  7. Android实战简易教程-第十枪(画廊组件Gallery有用研究)

    Gallery组件用于拖拽浏览图片,以下我们就来看一下怎样实现. 一.实现Gallery 1.布局文件非常easy: <?xml version="1.0" encoding ...

  8. Android实战简易教程-第二十三枪(基于Baas的用户注冊和登录模块实现!)

    接着上两篇文章.我们基于Bmob提供的API实现用户登录功能.总体看一下代码. 1.注冊页面xml: <RelativeLayout xmlns:android="http://sch ...

  9. Android实战简易教程-第四十枪(窃听风云之短信监听)

    近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台 ...

随机推荐

  1. linux学习之高并发服务器篇(二)

    高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...

  2. 23 HBase 存储架构。

    个 Region,Region会下线,新Split出的2个子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上由此过程 ...

  3. Windows远程登录Linux

    本文以Ubuntu Kylin1404为例,说明如何通过Windows远程登录Linux. 首先,要确保Ubuntu上SSH服务执行正常.默认情况下,Ubuntu已装有SSHclient.比方输入ss ...

  4. [Poi] Build and Analyze Your JavaScript Bundles with Poi

    Ever wonder where those extra KB in your bundle are coming from? This lesson walks you through runni ...

  5. 对照 Android 的 Intent 与 iOS StoryBoard 的 Segue - Intent 假设也能添加个prepareForSegue回调就好了

    对照 Android 的 Intent 与 iOS StoryBoard 的 Segue - Intent 假设也能添加个prepareForSegue回调就好了 太阳火神的漂亮人生 (http:// ...

  6. Spring Security 4 Method security using @PreAuthorize,@PostAuthorize, @Secured, EL--转

    原文地址:http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-pos ...

  7. HAProxy高可用配置视频教程

    HAProxy提供高可用性.负载均衡等,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理.HAProxy运行在当前的硬件上, ...

  8. url传递中文的解决方案总结

    File文件控件,选中文件(图片,flash,视频)即立即预览显示 .Net刷新页面的几种方式 Attributes.Add用途与用法(C#) url传递中文的解决方案总结 byte[] bytes ...

  9. 23种JavaScript设计模式

    原文链接:https://boostlog.io/@sonuton/23-javascript-design-patterns-5adb006847018500491f3f7f 转自: https:/ ...

  10. 学习参考《TensorFlow深度学习》高清中文版PDF+英文版PDF+源代码

    我们知道,TensorFlow是比较流行的深度学习框架,除了看手册文档外,推荐大家看看<Tensorflow深度学习>,共分5方面内容:基础知识.关键模块.算法模型.内核揭秘.生态发展.前 ...