欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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程序设计有所帮助。

上一篇:

下一篇: