你也许见过有的软件的列表界面当你拖动到最后一列的时候会出现一个“正在加载…”或者“更多”的按钮。然后列表会自动加载更多内容病自动显示。这是怎么实现的呢?原来就是在ListView的底部添加了一个页脚,用的是addFooterView().
怎么实现呢?首先,我们需要准备一些布局文档。分别有listview_xml(列表),listview_playlist_xml(列表布局),listview_foot_xml(列表页脚)
listview_xml 如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/listView"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</ListView>
</LinearLayout>
listview_playlist_xml 如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/line"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:text="name"
android:textSize="20dip"
android:textStyle="bold"
android:id="@+id/name_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:text="number"
android:id="@+id/number_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
listview_foot_xml 如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="center"
android:id="@+id/loading_line"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ProgressBar
android:layout_width="wrap_content"
android:id="@+id/progressBar1"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleSmall">
</ProgressBar>
<TextView
android:text="正在加载..."
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
</LinearLayout>
MListViewActivity.java 如下
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MListViewActivity extends Activity {
/** Called when the activity is first created. */
private ArrayList> ListItem = new ArrayList>();
private SimpleAdapter listAdap;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_xml);
ListView mListView = (ListView) findViewById(R.id.listView);
LayoutInflater infla = LayoutInflater.from(this);
//载入列表布局
infla.inflate(R.layout.listview_playlist_xml,
(ViewGroup) mListView.getEmptyView());
//这里就是向列表添加一个页脚的关键语句了
View foot = getLayoutInflater().inflate(R.layout.listview_foot_xml, null);
mListView.addFooterView(foot);
for (int i = 0; i < 20; i++) {
HashMap map = new HashMap();
map.put("name", "名字" + i);
map.put("number", "号码" + i);
ListItem.add(map);
}
//适配器,没什么好解释的
listAdap = new SimpleAdapter(this, ListItem,
R.layout.listview_playlist_xml,
new String[] { "name", "number" }, new int[] {
R.id.name_textView, R.id.number_textView });
mListView.setAdapter(listAdap);
}
}
好了,列表底部的页脚已经添加完毕了。当你滑动到列表的底端的时候就可以看到一个在旋转的圆圈和提示文字了。效果如下:

当然,显示一个页脚是不够的,我们还要配合多线程实现当滑动到页脚的时候自动加载内容。这我们就要用上ListView的setOnScrollListener来监听ListView的滑动。
对MListViewActivity.java的修改如下:
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MListViewActivity extends Activity {
/** Called when the activity is first created. */
private ArrayList> ListItem = new ArrayList>();
private SimpleAdapter listAdap;
private ListView mListView;
private View foot;
private Thread newThread;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch(msg.what){
case 1:
listAdap.notifyDataSetChanged();
break;
case 2:
mListView.removeFooterView(foot);
break;
}
super.handleMessage(msg);
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_xml);
mListView = (ListView) findViewById(R.id.listView);
LayoutInflater infla = LayoutInflater.from(this);
// 载入列表布局
infla.inflate(R.layout.listview_playlist_xml,
(ViewGroup) mListView.getEmptyView());
// 这里就是向列表添加一个页脚的关键语句了
foot = getLayoutInflater().inflate(R.layout.listview_foot_xml, null);
mListView.addFooterView(foot);
for (int i = 0; i < 20; i++) {
HashMap map = new HashMap();
map.put("name", "名字" + i);
map.put("number", "号码" + i);
ListItem.add(map);
}
// 适配器,没什么好解释的
listAdap = new SimpleAdapter(this, ListItem,
R.layout.listview_playlist_xml,
new String[] { "name", "number" }, new int[] {
R.id.name_textView, R.id.number_textView });
mListView.setAdapter(listAdap);
// 监听mListView
mListView.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
if (firstVisibleItem + visibleItemCount == totalItemCount) {
if (newThread == null || !newThread.isAlive()) {
newThread = new newThread();
newThread.start();
}
}
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
});
}
private void ListViewMore() {
// TODO Auto-generated method stub
Message msg = new Message();
if (ListItem.size() < 50) {
msg.what = 1;
for (int i = 20; i < 50; i++) {
HashMap map = new HashMap();
map.put("name", "名字" + i);
map.put("number", "号码" + i);
ListItem.add(map);
}
} else {
msg.what = 2;
}
mHandler.sendMessage(msg);
}
public class newThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(3000);
ListViewMore();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
以上是android菜鸟的心得,纯属写下来怕以后自己忘了。呵呵,高手莫拍啊。提供实例下载
mListView


















最近评论