ListView要动态加载请求数据,我们就需要监测ListView的滑动状态,当滑动到最后一条数据的时候,我们就去请求下一页的数据,所以我们需要监听OnScrollListener用来监听滑动状态,
ListView.setOnScrollListener();
下面是一个简单的Demo实现:
XML配置文件有二个:
footer_more.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:gravity="center_horizontal"
android:orientation="horizontal" >
<ProgressBar android:id="@+id/pd_load_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
style="@android:style/Widget.ProgressBar.Small.Inverse"
android:indeterminate="true"/>
<TextView android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="数据加载中..."/>
</LinearLayout>
main.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="wrap_content"
android:gravity="center"
android:text="ListView滑动加载效果"
android:textSize="18sp"/>
<ListView android:id="@+id/query_listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@android:color/transparent" >
</ListView>
</LinearLayout>
实现类
package com.example.sample;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class LoadMoreDemoActivity extends Activity implements OnScrollListener{
SimpleAdapter adapter;
ListView listView;
View footView;
ProgressBar load_progressBar;
TextView load_textView;
/**
* 数据集合
*/
List<Map<String, String>> data;
/**
* 每次新加载的数据量
*/
private int requestSize = 10;
/**
* 滑动到最后一条数据
*/
private int lastItem;
/**
* 加载完成的标记位
*/
private static final int LOAD_DATA_FINISHED = 1;
/**
* 加载完成后更新Adapter的Handler
*/
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case LOAD_DATA_FINISHED:
load_textView.setText("");
load_progressBar.setVisibility(View.GONE);
if(adapter != null){
adapter.notifyDataSetChanged();
}
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)findViewById(R.id.query_listView);
footView = getLayoutInflater().inflate(R.layout.footer_more, null);
load_progressBar = (ProgressBar)footView.findViewById(R.id.pd_load_more);
load_textView = (TextView)footView.findViewById(R.id.loading);
listView.addFooterView(footView);
initData();
adapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[]{"item","name"}, new int[]{android.R.id.text1,android.R.id.text2});
listView.setAdapter(adapter);
listView.setOnScrollListener(this);
}
private void initData(){
data = new ArrayList<Map<String,String>>();
for(int i = 0;i< 20;i++){
Map<String, String> map = new HashMap<String, String>();
map.put("item", i+"");
map.put("name", "测试数据--"+i);
data.add(map);
}
}
private void loadMoreData() {
load_textView.setText("数据加载中...");
load_progressBar.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@Override
public void run() {
if(lastItem<100){
for(int i = lastItem;i< lastItem+requestSize;i++){
Map<String, String> map = new HashMap<String, String>();
map.put("item", i+"");
map.put("name", "测试数据--"+i);
data.add(map);
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendEmptyMessage(LOAD_DATA_FINISHED);
}else{
handler.postDelayed(new Runnable() {
@Override
public void run() {
load_textView.setText("数据加载完啦...");
load_progressBar.setVisibility(View.GONE);
}
}, 1000);
}
}
}).start();
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//是否到达listView的最后一条
if(lastItem == adapter.getCount() && scrollState == OnScrollListener.SCROLL_STATE_IDLE){
loadMoreData();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//页面上可见的最后一条记录的位置
lastItem = firstVisibleItem + visibleItemCount - 1;
}
}
效果图: