布局文件
<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=".MainActivity" >
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/listView" />
</RelativeLayout>
单项布局文件listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="18sp"
android:id="@+id/textView"
/>
</LinearLayout>
页脚footer.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ProgressBar android:id="@+id/c81_forthBar"
android:layout_width="50dp"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyle" />
<TextView android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textSize="20sp"
android:text="@string/loading"
/>
</LinearLayout>
主类
package cn.android.datapage;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import cn.android.service.DataService;
public class MainActivity extends Activity {
private ListView listView;
private List<String> data = new ArrayList<String>();
//每次获取多少条数据
private int number = 20;
//总共有几页
private int maxpage = 5;
//判断是否加载完成
private boolean loadfinish = true;
private ArrayAdapter<String> adapter;
private 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());
//绑定数据
adapter = new ArrayAdapter<String>(this, R.layout.listview_item, R.id.textView, data);
listView.addFooterView(footer);
listView.setAdapter(adapter);
listView.removeFooterView(footer);
}
private final class ScrollListener implements OnScrollListener {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
//正在滚动时调用
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastItemId = listView.getLastVisiblePosition();
//判断数据是否达到最后一条记录
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();
//发送数据
handler.sendMessage(handler.obtainMessage(100, result));
}
}).start();
}
}
}
}
}
//通过handler对象来从子线程中获取数据
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//得到数据
data.addAll((List<String>) msg.obj);
//告诉listview更新数据了,要求显示
adapter.notifyDataSetChanged();
//删除页脚
if (listView.getFooterViewsCount() > 0)
listView.removeFooterView(footer);
loadfinish = true;
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
取数据的类
package cn.android.service;
import java.util.ArrayList;
import java.util.List;
/**
* 提供数据
* @author Administrator
*
*/
public class DataService {
public static List<String> getData() {
List<String> data = new ArrayList<String>();
for (int i = 0; i < 22; i++) {
data.add("我就是数据"+i);
}
return data;
}
}