如何在handler传递list中更新list

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&& 今天看到论坛上有人问这个。估计是要搞一个类似下载软件的东西吧。
& 所以就有了本篇,原理:
& 处理线程先给handler发消息,消息中包括进度信息,handler在去更改List的Adapter里面的信息,并通知List更新UI。
& 原理很简单,就直接上码了:
package hol.test.
import java.util.ArrayL
import java.util.HashM
import java.util.L
import android.app.A
import android.content.C
import android.os.B
import android.os.H
import android.os.M
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.B
import android.widget.ListV
import android.widget.ProgressB
import android.widget.TextV
public class TestListProgress extends Activity {
private Button testDo =
private ListView progressList =
private List&HashMap&String, Object&&
private MyAdapter myA
private MyHandler myH
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myHandler = new MyHandler();
findView();
addListerner();
initList();
private void findView() {
testDo = (Button) findViewById(R.id.btn_test);
progressList = (ListView) findViewById(R.id.lst_progress);
private void addListerner() {
testDo.setOnClickListener(new ClickEvent());
private void initList() {
list = new ArrayList&HashMap&String, Object&&();
HashMap&String, Object& dataA = new HashMap&String, Object&();
HashMap&String, Object& dataB = new HashMap&String, Object&();
dataA.put("title", "dataA");
dataA.put("current", 0);
list.add(dataA);
dataB.put("title", "dataB");
dataB.put("current", 0);
list.add(dataB);
myAdapet = new MyAdapter(TestListProgress.this, list);
progressList.setAdapter(myAdapet);
// 模拟处理线程
class UpdateRunnable implements Runnable {
int currentPos = 0;
public UpdateRunnable(int id, int delay, MyHandler handler) {
this.handler =
this.delay =
public void run() {
// TODO Auto-generated method stub
while (currentPos &= 100) {
Message msg = handler.obtainMessage();
msg.what = 1;
msg.arg1 =
msg.arg2 = currentP
currentPos = currentPos + 5;
msg.sendToTarget();
Thread.sleep(delay);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 消息Handler用来更新UI
class MyHandler extends Handler {
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
int id = msg.arg1;
int current = msg.arg2;
updateProgress(id, current);
super.handleMessage(msg);
private void updateProgress(int id, int currentPos) {
HashMap&String, Object& dataTemp = list.get(id);
dataTemp.put("current", currentPos);
myAdapet.chargeProgress(id, dataTemp);
// 按钮事件
class ClickEvent implements View.OnClickListener {
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case (R.id.btn_test):
new Thread(new UpdateRunnable(0, 400, myHandler)).start();
new Thread(new UpdateRunnable(1, 200, myHandler)).start();
System.out.println("OnClick");
// List的显示
class MyAdapter extends BaseAdapter {
List&HashMap&String, Object&&
LayoutInflater infl =
public MyAdapter(Context context, List&HashMap&String, Object&& list) {
this.infl = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.list =
public int getCount() {
// TODO Auto-generated method stub
return list.size();
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
public long getItemId(int position) {
// TODO Auto-generated method stub
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
convertView = infl.inflate(R.layout.list_layout, null);
ProgressBar progressBar = (ProgressBar) convertView
.findViewById(R.id.progress);
TextView titleView = (TextView) convertView
.findViewById(R.id.title);
HashMap&String, Object& detail = list.get(position);
String t = (String) detail.get("title");
titleView.setText(t);
int progress = (Integer) detail.get("current");
progressBar.setProgress(progress);
return convertV
// 改变进度,postion就是要改的那个进度
public void chargeProgress(int postion, HashMap&String, Object& detail) {
this.list.set(postion, detail);
// System.out.println("charged:" + detail.get("current"));
notifyDataSetChanged();
MyAdapet 里面的 chargeProgress是在用来更新List里面的值。
Message里面arg1就是List中的第几个进度条,arg2就是这个进度条里面的当前应该有的进度。what暂时没什么意义,只是为了标识这类消息是用来更新进度条的。本例也只有这一类消息。
这个是List的LayoutXML文件内容:
&LinearLayout
xmlns:android="/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"&
&TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="In list"
android:layout_marginRight="5dip"
&/TextView&
&ProgressBar android:id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"
android:layout_weight="1.0"
android:visibility="visible"
&/LinearLayout&
Acitvity的布局:
&LinearLayout xmlns:android="/apk/res/android"
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"
&Button android:id="@+id/btn_test"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ListProgress"
&ListView android:id="@+id/lst_progress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
&/ListView&
&/LinearLayout&
效果图如下:
阅读(...) 评论()public class MapDownActivity extends Activity {
private ListV
private static final String Path = &http://192.168.1.125:8080/MapServer/mapServer.do?para=getMapList&;
private MapListA
private ProgressB
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pb = (ProgressBar) findViewById(R.id.progressBar);
pb.setMax(100);
pb.setVisibility(View.INVISIBLE);
adapter = new MapListAdapter(this, getData(),pb,getApplicationContext());
list = (ListView) findViewById(R.id.listView1);
list.setAdapter(adapter);
private List&MapListItem& getData() {
//节省空间,这里是获取数据的
自定义一个adapter处理list与下载线程之间的通信Java code
public class MapListAdapter extends BaseAdapter {
List&MapListItem&
MapListControlH
private ProgressB
public MapListAdapter(Activity a, List&MapListItem& values,
ProgressBar pb,Context context) {
this.values =
this.context=
public void addItem(MapListItem item) {
values.add(item);
public int getCount() {
return values.size();
public MapListItem getItem(int arg0) {
return values.get(arg0);
public void setItem(MapListItem item, int arg0) {
values.set(arg0, item);
notifyDataSetChanged();
public long getItemId(int arg0) {
return arg0;
public View getView(int position, View convertView, ViewGroup parent) {
View view = a.getLayoutInflater().inflate(R.layout.maplist, null);
TextView tv1 = (TextView) view.findViewById(R.id.mapname);
tv1.setText(values.get(position).getName());
TextView tv2 = (TextView) view.findViewById(R.id.downtext);
tv2.setText(values.get(position).getStatus());
//这样会生成很多handler吧,不知道是不是这儿出的问题
handler=new MapListControlHandler(pb, context);
handler.setItem(values.get(position));
handler.setAdapter(this);
handler.setPosition(position);
tv2.setOnClickListener(new MapDownOnClick(handler));
TextView tv3 = (TextView) view.findViewById(R.id.data);
tv3.setText(values.get(position).getDate());
TextView tv4 = (TextView) view.findViewById(R.id.updata);
tv4.setText(values.get(position).getPro());
handler的处理部分Java code
public void handleMessage(Message msg) {
if (!Thread.currentThread().isInterrupted()) {
switch (msg.what) {
Toast.makeText(context, &已加入下载队列&, 1).show();
pb.setVisibility(View.VISIBLE);
pb.setProgress(msg.arg1);
pb.setProgress(100);
pb.setVisibility(View.INVISIBLE);
pb.setProgress(0);
item.setStatus(&下载完成&);
adapter.setItem(item, position);
下载文件部分Java code
private void writeToDevice(String content, String name, Handler handler) {
Message message = new Message();
message.what = 0;
handler.sendMessage(message);
OutputStream outputS
int DownedFileLength = 0;
String savePathString = mapdir + name + &.000&;
Log.i(&下载文件------------&&, name);
File file = new File(savePathString);
if (!file.exists()) {
file.createNewFile();
outputStream = new FileOutputStream(file);
byte[] buffer = content.getBytes(&ISO-8859-1&);
int FileLength = buffer.
int count = 1024 * 4;
while (DownedFileLength & FileLength) {
if (DownedFileLength + count & FileLength)
count = FileLength - DownedFileL
outputStream.write(buffer, DownedFileLength, count);
message = new Message();
message.what = 1;
message.arg1 = (int) ((int) DownedFileLength * 100 / FileLength);
handler.sendMessage(message);
DownedFileLength +=
outputStream.close();
message = new Message();
message.what = 2;
handler.sendMessage(message);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有listview当界面数据发生变化时,使用notifyDataSetChanged()刷新界面
1.当点击一个按钮,在事件中如:onclick(View v){
switch(v.getId()){
case R.id.deletePerson:
//得到数据更变后,adapter所需要的集合
= getUpdateList();
//调用此方法时行通知
&&&adapter.notifyDataSetChanged();
//调用方法通知UI线程界面数据发生化
&&&initUI(0);
case ****:
2.在子线程中去获得变化后的新集合,并通知UI线程更新界面
void inintUI(int type){
&&new Thread() {
&&&@Override
&&&public void
&&&&switch
0:// all call record
//取得改变后的集合
allList = getAllcallList();
= new Message();
//设置一个标志
&&&&&msg.what
= ALLCALL;
 //通过handler向UI线程发送一个消息
&&&&&handler.sendMessage(msg);
1:// outgoing call record
&&&&&outgoingList
= getCallOutList();
= new Message();
&&&&&msg1.what
= OUTGOING;
&&&&&handler.sendMessage(msg1);
2:// incoming call record
&&&&&incomingList
= getCallInList();
= new Message();
&&&&&msg2.what
= INCOMING;
&&&&&handler.sendMessage(msg2);
3:// miss call record
&&&&&misscallList
= getCallMissList();
= new Message();
&&&&&msg3.what
= MISSCALL;
&&&&&handler.sendMessage(msg3);
&&}.start();&
3.在UI的handler中更新adapter
private Handler handler = new Handler() {
&&public void
handleMessage(Message msg) {
&&&adapter =
(msg.what) {
//设置adapter
&&&&adapter
= new HomeDialAdapter(HomeDialActivity.this,
&&&&&&allCallRecordList);
&&&&callLogList.setAdapter(adapter);
&&&&adapter
= new HomeDialAdapter(HomeDialActivity.this,
&&&&&&outgoingList);
&&&&callLogList.setAdapter(adapter);
这样就实现在listview界面的更新
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 使用handler更新ui 的文章

 

随机推荐