在使用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 |
} |
