有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView。今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.从今天起,每次学习的源代码都会打包上传,方便各位同学学习,注册帐号即可下载。
布局main.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/lv"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="@string/hello"
/>
</
LinearLayout
>

ListView列表布局playlist.xml:

<?
xml version="1.0" encoding="utf-8"
?>
<
TextView
android:id
="@+id/text1"
xmlns:android
="http://schemas.android.com/apk/res/android"
android:layout_width
="fill_parent"
android:layout_height
="30px"
android:textSize
="18sp"
></
TextView
>

程序代码:

1
import
java.util.ArrayList;
2
3
import
android.app.Activity;
4
import
android.os.AsyncTask;
5
import
android.os.Bundle;
6
import
android.os.Handler;
7
import
android.view.View;
8
import
android.widget.AdapterView;
9
import
android.widget.ArrayAdapter;
10
import
android.widget.ListView;
11
import
android.widget.AdapterView.OnItemClickListener;
12
13
public
class
main
extends
Activity {
14
/**
Called when the activity is first created.
*/
15
ListView lv;
16
ArrayAdapter
<
String
>
Adapter;
17
ArrayList
<
String
>
arr
=
new
ArrayList
<
String
>
();
18
@Override
19
public
void
onCreate(Bundle savedInstanceState) {
20
super
.onCreate(savedInstanceState);
21
setContentView(R.layout.main);
22
lv
=
(ListView)findViewById(R.id.lv);
23
arr.add(
"
123
"
);
24
arr.add(
"
234
"
);
25
arr.add(
"
345
"
);
26
Adapter
=
new
ArrayAdapter
<
String
>
(
this
,R.layout.playlist, arr);
27
lv.setAdapter(Adapter);
28
lv.setOnItemClickListener(lvLis);
29
editItem edit
=
new
editItem();
30
edit.execute(
"
0
"
,
"
第1项
"
);
//
把第一项内容改为"第一项"
31
Handler handler
=
new
Handler();
32
handler.postDelayed(add,
3000
);
//
延迟3秒执行
33
}
34
Runnable add
=
new
Runnable(){
35
36
@Override
37
public
void
run() {
38
//
TODO Auto-generated method stub
39
arr.add(
"
增加一项
"
);
//
增加一项
40
Adapter.notifyDataSetChanged();
41
}
42
};
43
class
editItem
extends
AsyncTask
<
String,Integer,String
>
{
44
@Override
45
protected
String doInBackground(String... params) {
46
arr.set(Integer.parseInt(params[
0
]),params[
1
]);
47
//
params得到的是一个数组,params[0]在这里是"0",params[1]是"第1项"
48
//
Adapter.notifyDataSetChanged();
49
//
执行添加后不能调用 Adapter.notifyDataSetChanged()更新UI,因为与UI不是同线程
50
//
下面的onPostExecute方法会在doBackground执行后由UI线程调用
51
return
null
;
52
}
53
54
@Override
55
protected
void
onPostExecute(String result) {
56
//
TODO Auto-generated method stub
57
super
.onPostExecute(result);
58
Adapter.notifyDataSetChanged();
59
//
执行完毕,更新UI
60
}
61
62
}
63
private
OnItemClickListener lvLis
=
new
OnItemClickListener(){
64
@Override
65
public
void
onItemClick(AdapterView
<?>
arg0, View arg1,
int
arg2,
66
long
arg3) {
67
//
点击条目时触发
68
//
arg2即为点中项的位置
69
setTitle(String.valueOf(arr.get(arg2)));
70
71
}
72
73
};
74
75
}
