Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)
程序员文章站
2023-12-11 15:52:04
本文实例讲述了android通过handler与asynctask两种方式动态更新listview的方法。分享给大家供大家参考,具体如下:
有时候我们需要修改已经生成的列...
本文实例讲述了android通过handler与asynctask两种方式动态更新listview的方法。分享给大家供大家参考,具体如下:
有时候我们需要修改已经生成的列表,添加或者修改数据,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>
程序代码:
package com.pocketdigi; import java.util.arraylist; import android.app.activity; import android.os.asynctask; import android.os.bundle; import android.os.handler; import android.view.view; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.listview; import android.widget.adapterview.onitemclicklistener; public class main extends activity { /** called when the activity is first created. */ listview lv; arrayadapter<string> adapter; arraylist<string> arr=new arraylist<string>(); @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); lv=(listview)findviewbyid(r.id.lv); arr.add("123"); arr.add("234"); arr.add("345"); adapter = new arrayadapter<string>(this,r.layout.playlist, arr); lv.setadapter(adapter); lv.setonitemclicklistener(lvlis); edititem edit= new edititem(); edit.execute("0","第1项");//把第一项内容改为"第一项" handler handler=new handler(); handler.postdelayed(add,3000);//延迟3秒执行 } runnable add=new runnable(){ @override public void run() { // todo auto-generated method stub arr.add("增加一项");//增加一项 adapter.notifydatasetchanged(); } }; class edititem extends asynctask<string,integer,string>{ @override protected string doinbackground(string... params) { arr.set(integer.parseint(params[0]),params[1]); //params得到的是一个数组,params[0]在这里是"0",params[1]是"第1项" //adapter.notifydatasetchanged(); //执行添加后不能调用 adapter.notifydatasetchanged()更新ui,因为与ui不是同线程 //下面的onpostexecute方法会在dobackground执行后由ui线程调用 return null; } @override protected void onpostexecute(string result) { // todo auto-generated method stub super.onpostexecute(result); adapter.notifydatasetchanged(); //执行完毕,更新ui } } private onitemclicklistener lvlis=new onitemclicklistener(){ @override public void onitemclick(adapterview<?> arg0, view arg1, int arg2, long arg3) { //点击条目时触发 //arg2即为点中项的位置 settitle(string.valueof(arr.get(arg2))); } }; }
打包的源代码中有错误,adapter.notifydatasetchanged();在doinbackground中,请作相应修改,感谢同学提醒。
完整实例代码代码点击此处本站下载。
希望本文所述对大家android程序设计有所帮助。