android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法。分享给大家供大家参考,具体如下:

有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView。今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.

布局main.xml:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

ListView列表布局playlist.xml:

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"

>

程序代码:

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 Adapter;

ArrayList arr=new ArrayList();

@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(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{

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值