首页 > 其他分享 >Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)

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

时间:2022-11-11 15:36:12浏览次数:60  
标签:pull int Baas public 数据表 import Android loadingLayout android


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

效果图: 

                               正在刷新                                                                       刷新后

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)_android

      

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)_ide_02

一、导入Library

下载源码后(​​https://github.com/chrisbanes/Android-PullToRefresh​​),里面有个Library工程,添加工程到Eclipse中;

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)_Android_03


另外extras文件夹还有两个工程:PullToRefreshListFragment和PullToRefreshViewPager,由于我们的这个用不到他们的库文件,所以不必导入了;

二、实战

1、新建工程,添加Libray库到工程中

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

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)_分页_04

2、重写activity_main.xml

XML内容为:

[html]    ​​view plain​​   ​​copy​​   ​​​   ​​​   

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.
7. <!-- The PullToRefreshListView replaces a standard ListView widget. -->
8. <com.handmark.pulltorefresh.library.PullToRefreshListView
9. android:id="@+id/pull_refresh_list"
10. android:layout_width="fill_parent"
11. android:layout_height="fill_parent"
12. android:cacheColorHint="#00000000"
13. android:divider="#19000000"
14. android:dividerHeight="4dp"
15. android:fadingEdge="none"
16. android:fastScrollEnabled="false"
17. android:footerDividersEnabled="false"
18. android:headerDividersEnabled="false"
19. android:smoothScrollbar="true" />
20.
21. </LinearLayout>

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

下面我们看一下具体怎么实现的。

先在数据表中插入数据:

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)_android_05

然后看代码,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 one rror(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>



运行实例,下拉刷新:

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)_数据_06

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

Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉加载实现!)_Android_07



标签:pull,int,Baas,public,数据表,import,Android,loadingLayout,android
From: https://blog.51cto.com/u_15866446/5845023

相关文章

  • 关于MacBook怎么更新Android SDK
    昨天公司的人给了我一个VPN,但是还是无法更新SDK,后来发现将下图:通过VPN发送所有流量勾选以后就可以连接更新了,哎,处处皆学问,特此分享一下此经验。喜欢的朋友关注我哦!多谢支持......
  • Android 找不到资源文件错误的解决办法
    有些时候我们明明在layout文件夹下面配置了布局文件,但是在activity中却报错,提示找不到该文件。解决办法:这是因为你导入的R包不对,将activity文件import中后缀为.R的一行删除,......
  • Android studio 日志输出
      Log.v("Tag","Msg");//Verbose观察值,Verbose是冗长、啰嗦的意思,任何消息都会输出Log.d("Tag","Msg");//Debug调试Log.i("Tag","Msg");//Info信息,为一般提示......
  • Android--调用百度地图API
    首先申请一个百度地图的APIKEY,具体方法网上已有,申请后获得:main.xml代码如下:<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:to......
  • Android项目实战-云词典
    前段时间在网上看到了一篇滴答词典的项目文章,实现简单的单词查找、整句翻译和生词本功能,但是该项目年代久远,所用的API已不再提供数据,我决定利用它的已有框架实现其功能,主要......
  • Android中Task任务栈的分配
    首先我们来看下Task的定义,Google是这样定义Task的:ataskiswhattheuserexperiencesasan"application."It'sagroupofrelatedactivities,arrangedinastack.......
  • Android实战简易教程-第十枪(画廊组件Gallery实用研究)
    Gallery组件用于拖拽浏览图片,下面我们就来看一下如何实现。一、实现Gallery1.布局文件很简单:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://......
  • Android实战简易教程-第十二枪(ViewFlipper实现幻灯效果)
    ViewFlipper在实际项目中用到的不是很多了,但是作为初学者的我们还是有必要了解一下它的主要用法。本实例结合手势类(GestureDetector),实现图片的浏览功能。直接看代码1.MainA......
  • 【Android动画九章】-浮动菜单
    上几节讨论了各种各样的属性动画,这里将这些知识组合起来,模拟如下图所示的浮动菜单功能。1.activity_main.xml:<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns......
  • 【Android动画九章】-属性动画集
    上一节通过ObjectAnimator类见识了什么是Android属性动画,不过都是单一的动画,下面通过例子学习一下组合动画也就是动画集是如何实现的,主要可以通过几种方式来实现,下面一一介......