啥都不多说,直接上代码,自己看注释
MainActivity的布局
<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" >
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000"
/>
</RelativeLayout>
加载中(loading)的那个布局
<?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="wrap_content"
android:orientation="horizontal"
android:paddingBottom="20dip"
android:paddingTop="20dip"
android:visibility="gone">
<ProgressBar
android:id="@+id/progressBar2"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/loadmore_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="数据加载中..."
android:textSize="18dip" />
</LinearLayout>
这是主要的逻辑代码
package com.xzw.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity extends Activity implements OnScrollListener {
private static final String TAG = "MainActivity";
private ListView listView;
private View moreView; //加载更多页面
private SimpleAdapter adapter;
private ArrayList<HashMap<String, String>> listData;
private int lastItem;
private int count;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView);
moreView = getLayoutInflater().inflate(R.layout.load, null);
listData = new ArrayList<HashMap<String,String>>();
//准备数据,先给list添加假数据
prepareData();
count = listData.size();
adapter = new SimpleAdapter(this, listData,R.layout.item,
new String[]{"itemText"}, new int[]{R.id.itemText});
//添加底部view,一定要在setAdapter之前添加,否则会报错。
listView.addFooterView(moreView);
listView.setAdapter(adapter); //设置adapter
//设置listview的滑动事件监听,如果在Fragment等非Activity中可以直接new出来
listView.setOnScrollListener(this);
}
//添加假数据
private void prepareData(){
for(int i=0;i<10;i++){
HashMap<String, String> map = new HashMap<String, String>();
map.put("itemText", "测试数据"+i);
listData.add(map);
}
}
/**
* 加载更多的数据,count是用设置每次加载开始的位置,每次加载5条
*/
private void loadMoreData(){
count = adapter.getCount();
for(int i=count;i<count+5;i++){
HashMap<String, String> map = new HashMap<String, String>();
map.put("itemText", "测试数据"+i);
listData.add(map);
}
count = listData.size();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
Log.i(TAG, "firstVisibleItem="+firstVisibleItem+"\nvisibleItemCount="+
visibleItemCount+"\ntotalItemCount"+totalItemCount);
lastItem = firstVisibleItem + visibleItemCount - 1; //减1是因为上面加了个addFooterView
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i(TAG, "scrollState="+scrollState);
//下拉到空闲是,且最后一个item的数等于数据的总数时,进行更新
if(lastItem == count && scrollState == this.SCROLL_STATE_IDLE){
Log.i(TAG, "拉到最底部");
moreView.setVisibility(view.VISIBLE);
mHandler.sendEmptyMessage(0);
}
}
//声明Handler,由于是假数据,上拉时先睡几秒
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
loadMoreData(); //加载更多数据,这里可以使用异步加载
adapter.notifyDataSetChanged();
moreView.setVisibility(View.GONE);
if(count >=listData.size() ){
Toast.makeText(MainActivity.this, "木有更多数据!", 3000).show();
listView.removeFooterView(moreView); //移除底部视图
}
Log.i(TAG, "加载更多数据");
break;
case 1:
break;
default:
break;
}
};
};
}