当前位置: 移动技术网 > IT编程>移动开发>Android > Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

2019年07月24日  | 移动技术网IT编程  | 我要评论

云南旅游报价,平壤艺术团金兰姬,黎柳蝉

本文实例讲述了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程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网