在使用ListView時,會遇到當ListView列表滑動到最底端時,添加新的列表項的問題,本文通過代碼演示如何動態的添加新的列表項到ListView中。
實現步驟:調用ListView的setOnScrollListener()方法設置滑動監聽器,實現OnScrollListener接口的方法,判斷當列表滑動到最低端時,加載新的列表項。
其中OnScrollListener接口需要實現如下兩個方法:
onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
view 報告滑動狀態的視圖
firstVisibleItem 可視的第一個列表項的索引
visibleItemCount 可視的列表項個數
totalItemCount 總共的列表項個數
onScrollStateChanged(AbsListView view, int scrollState)
view 報告滑動狀態的視圖
scrollState 滑動狀態
滑動狀態包括
SCROLL_STATE_IDLE : 0 視圖沒有滑動
SCROLL_STATE_TOUCH_SCROLL : 1 用戶正在觸摸滑動,手指仍在屏幕上
SCROLL_STATE_FLING : 2 用戶之前觸摸滑動,現在正在滑行,直到停止
下面通過代碼給大家演示效果
main.xml
1 |
<? xml version = "1.0" encoding = "utf-8" ?> |
2 |
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" |
3 |
android:orientation = "vertical" |
4 |
android:layout_width = "fill_parent" |
5 |
android:layout_height = "fill_parent" |
6 |
> |
7 |
< ListView |
8 |
android:id = "@id/android:list" |
9 |
android:layout_width = "match_parent" |
10 |
android:layout_height = "match_parent" |
11 |
android:layout_weight = "1" |
12 |
android:drawSelectorOnTop = "false" |
13 |
/> |
14 |
</ LinearLayout > |
footer.xml
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 = "wrap_content" |
5 |
android:gravity = "center" |
6 |
android:orientation = "horizontal" |
7 |
> |
8 |
< ProgressBar |
9 |
android:id = "@+id/progressbar" |
10 |
android:layout_width = "wrap_content" |
11 |
android:layout_height = "wrap_content" |
12 |
style = "\?android:attr/progressBarStyleSmall" |
13 |
/> |
14 |
< TextView |
15 |
android:layout_width = "wrap_content" |
16 |
android:layout_height = "wrap_content" |
17 |
android:textSize = "20.0sp" |
18 |
android:text = "正在加載..." |
19 |
/> |
20 |
</ LinearLayout > |
MainActicity.xml
1 |
package com.szy.listview; |
2 |
3 |
import android.app.ListActivity; |
4 |
import android.os.Bundle; |
5 |
import android.os.Handler; |
6 |
import android.os.Message; |
7 |
import android.view.Gravity; |
8 |
import android.view.View; |
9 |
import android.view.ViewGroup; |
10 |
import android.widget.AbsListView; |
11 |
import android.widget.BaseAdapter; |
12 |
import android.widget.ListView; |
13 |
import android.widget.TextView; |
14 |
15 |
/** |
16 |
*@author coolszy |
17 |
*@date 2012-3-27 |
18 |
*@blog http://blog.92coding.com |
19 |
*/ |
20 |
public class MainActivity extends ListActivity |
21 |
{ |
22 |
private ListView mListView; |
23 |
private CustomAdapter mAdapter; |
24 |
private int mScrollState; |
25 |
private View mFooter; |
26 |
27 |
@Override |
28 |
public void onCreate(Bundle savedInstanceState) |
29 |
{ |
30 |
super .onCreate(savedInstanceState); |
31 |
setContentView(R.layout.main); |
32 |
33 |
//獲取ListView |
34 |
mListView = getListView(); |
35 |
//根據footer.xml描述創建View |
36 |
mFooter = getLayoutInflater().inflate(R.layout.footer, null ); |
37 |
// 在ListView底部添加正在加載視圖 |
38 |
//注意:addFooterView方法需要在調用setListAdapter方法前調用! |
39 |
mListView.addFooterView(mFooter); |
40 |
mAdapter = new CustomAdapter(); |
41 |
setListAdapter(mAdapter); |
42 |
//給ListView添加滾動監聽器 |
43 |
mListView.setOnScrollListener( new AbsListView.OnScrollListener() |
44 |
{ |
45 |
@Override |
46 |
public void onScrollStateChanged(AbsListView view, int scrollState) |
47 |
{ |
48 |
//記錄當前狀態 |
49 |
mScrollState = scrollState; |
50 |
} |
51 |
52 |
@Override |
53 |
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) |
54 |
{ |
55 |
// 可視的最后一個列表項的索引 |
56 |
int lastVisibleItem = firstVisibleItem + visibleItemCount - 1 ; |
57 |
//當列表正處於滑動狀態且滑動到列表底部時,執行 |
58 |
if (mScrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE |
59 |
&& lastVisibleItem == totalItemCount - 1 ) |
60 |
{ |
61 |
// 執行線程,模擬睡眠5秒鍾后添加10個列表項 |
62 |
new Thread() |
63 |
{ |
64 |
65 |
private Handler handler = new Handler() |
66 |
{ |
67 |
68 |
@Override |
69 |
public void handleMessage(Message msg) |
70 |
{ |
71 |
super .handleMessage(msg); |
72 |
//增加Item數量 |
73 |
mAdapter.count += 10 ; |
74 |
//通知數據集變化 |
75 |
mAdapter.notifyDataSetChanged(); |
76 |
} |
77 |
78 |
}; |
79 |
80 |
@Override |
81 |
public void run() |
82 |
{ |
83 |
super .run(); |
84 |
try |
85 |
{ |
86 |
sleep( 5000 ); |
87 |
handler.sendEmptyMessage( 0 ); |
88 |
} catch (InterruptedException e) |
89 |
{ |
90 |
e.printStackTrace(); |
91 |
} |
92 |
} |
93 |
94 |
}.start(); |
95 |
} |
96 |
} |
97 |
}); |
98 |
} |
99 |
100 |
private class CustomAdapter extends BaseAdapter |
101 |
{ |
102 |
// 初始列表項數量 |
103 |
int count = 20 ; |
104 |
105 |
@Override |
106 |
public int getCount() |
107 |
{ |
108 |
return count; |
109 |
} |
110 |
111 |
@Override |
112 |
public Object getItem( int position) |
113 |
{ |
114 |
return position; |
115 |
} |
116 |
117 |
@Override |
118 |
public long getItemId( int position) |
119 |
{ |
120 |
return position; |
121 |
} |
122 |
123 |
@Override |
124 |
public View getView( int position, View convertView, ViewGroup parent) |
125 |
{ |
126 |
TextView result = (TextView) convertView; |
127 |
//動態創建TextView添加早ListView中 |
128 |
if (result == null ) |
129 |
{ |
130 |
result = new TextView(MainActivity. this ); |
131 |
result.setTextAppearance(MainActivity. this , android.R.style.TextAppearance_Large); |
132 |
AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams |
133 |
(AbsListView.LayoutParams.FILL_PARENT, |
134 |
AbsListView.LayoutParams.WRAP_CONTENT); |
135 |
result.setLayoutParams(layoutParams); |
136 |
result.setGravity(Gravity.CENTER); |
137 |
} |
138 |
result.setText( "第 " + (position + 1 )+ "行" ); |
139 |
return result; |
140 |
} |
141 |
} |
142 |
} |