Android ListView 多条目动态更新进度 使用Handler callback 接口
来源:互联网 发布:淘宝女童模特佳佳 编辑:程序博客网 时间:2024/05/18 03:19
安卓ListView,有时会有这样的需求:
对多条目进行动态的更新界面,比如多条目动态下载或上传时的进度条或者其他的需要动态更新多条目状态的场景。
在安卓中通常的做法是使用Handler处理状态改变的消息的传递,但是单纯使用Handler发送消息的方式仅仅能够实现单一条目的数据更新而达不到需求,对此Handler同样提供了强大的回调处理方式---Runnable,下面我贴下代码详细地描述代码流程。
package com.handler;import java.util.ArrayList;import java.util.List;import java.util.Random;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;import com.bangyue.R;/** * ListView多条目进度视图状态更新。 * * 使用handler callback。 * * @author bangyue * @version [版本号, 2014-5-27] * @see [相关类/方法] * @since [产品/模块版本] */public class MultiItemUpdateActivity extends Activity { public static final int STATUS_FAIL = -1;//失败 public static final int STATUS_BACKGROUND = -2;//后台任务,无需更新到界面,因为条目不可视状态时 public static final int STATUS_RUNNING = 1;//运行中 public static final int STATUS_FINISH = 2;//结束 public static final int STATUS_PRESTART = 0;//未开始 ListView lvMultiUpdate; MultiUpdateAdapter mAdapter; List<ItemEntity> datas = new ArrayList<MultiItemUpdateActivity.ItemEntity>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.multi_update_activity); lvMultiUpdate = (ListView)findViewById(R.id.lvMultiUpdate); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); datas.add(new ItemEntity()); mAdapter = new MultiUpdateAdapter(datas); lvMultiUpdate.setAdapter(mAdapter); } class MultiUpdateAdapter extends BaseAdapter { List<ItemEntity> datas; public MultiUpdateAdapter(List<ItemEntity> datas) { super(); this.datas = datas; } @Override public int getCount() { if (datas != null) return datas.size(); return 0; } @Override public Object getItem(int position) { if (datas != null && datas.size() >= position + 1) datas.get(position); return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ItemEntity entity = (ItemEntity)datas.get(position); ViewHolder vh = null; if (convertView != null) { vh = (ViewHolder)convertView.getTag(); } else { vh = new ViewHolder(); convertView = MultiItemUpdateActivity.this.getLayoutInflater().inflate(R.layout.multi_update_item, null); vh.pbStatus = (ProgressBar)convertView.findViewById(R.id.pbStatus); vh.tvValue = (TextView)convertView.findViewById(R.id.tvValue); convertView.setTag(vh); } //判断实体状态,未开始则创建任务,任务已经在开始了则把最新的ViewHolder设置给callback int status = entity.getStatus(); //设置与viewHolder绑定的老实体为后台状态 if (vh.entity != null) { vh.entity.setBackground(true); } //设置新实体为前台可视 entity.setBackground(false); vh.entity = entity; if (status == STATUS_PRESTART) { vh.tvValue.setText("任务马上开始"); MultiRunnable r = new MultiRunnable(vh, entity); entity.setCallback(r); entity.setStatus(STATUS_RUNNING); testMultiThreadDownload(entity.url, new Handler(), r); } else if (status == STATUS_RUNNING) { MultiRunnable r = entity.getCallback(); if (r != null) { //重置老的视图,设置新的视图给handler ViewHolder vhOld = r.getVh(); if (vhOld != null) { vhOld.tvValue.setText(""); vhOld.pbStatus.setVisibility(View.GONE); } r.setVh(vh); } } else if (status == STATUS_FINISH) { vh.tvValue.setText("任务完成TTTTTT"); vh.pbStatus.setVisibility(View.GONE); } else if (status == STATUS_FAIL) { vh.tvValue.setText("任务失败FFFFFF"); vh.pbStatus.setVisibility(View.GONE); } return convertView; } } /** * 实体类。 * * 把Runnable callback和实体进行绑定。 */ class ItemEntity { public boolean isBackground() { return background; } public void setBackground(boolean background) { this.background = background; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public MultiRunnable getCallback() { return callback; } public void setCallback(MultiRunnable callback) { this.callback = callback; } String url; int status; boolean background; MultiRunnable callback; } public class MultiRunnable implements Runnable { public ViewHolder getVh() { return vh; } public void setVh(ViewHolder vh) { this.vh = vh; } public Message getMsg() { return msg; } public void setMsg(Message msg) { this.msg = msg; } ViewHolder vh; ItemEntity entity; Message msg; public MultiRunnable(ViewHolder vh, ItemEntity entity) { this.vh = vh; this.entity = entity; } @Override public void run() { //视图在前台显示,且获取到msg if (msg != null) { switch (msg.what) { case STATUS_RUNNING: { int count = msg.arg1; if (!entity.isBackground()) { vh.tvValue.setText("+" + count); vh.pbStatus.setVisibility(View.VISIBLE); } } break; case STATUS_FINISH: { if (!entity.isBackground()) { vh.tvValue.setText("任务完成TTTTTT"); vh.pbStatus.setVisibility(View.GONE); } entity.setStatus(STATUS_FINISH); } break; case STATUS_FAIL: { if (!entity.isBackground()) { vh.tvValue.setText("任务失败FFFFFF"); vh.pbStatus.setVisibility(View.GONE); } entity.setStatus(STATUS_FAIL); } break; case STATUS_PRESTART: break; default: break; } } } } static class ViewHolder { ProgressBar pbStatus; TextView tvValue; ItemEntity entity; } /** * 模拟下载。 */ public static void testMultiThreadDownload(final String url, final Handler handler, final MultiRunnable r) { new Thread() { @Override public void run() { int count = 0; try { //首次睡眠3秒 Random rd = new Random(); Thread.sleep(1000 * (rd.nextInt(5) + 1)); while (count < 200) { count += 5; //发送更新状态 handler.removeCallbacks(r); Message msg = new Message(); msg.what = STATUS_RUNNING; msg.arg1 = count; r.setMsg(msg); handler.post(r); Thread.sleep(1500); } //任务结束 handler.removeCallbacks(r); Message msg = new Message(); msg.what = STATUS_FINISH; r.setMsg(msg); handler.post(r); } catch (InterruptedException e) { e.printStackTrace(); //任务失败 handler.removeCallbacks(r); Message msg = new Message(); msg.what = STATUS_FAIL; r.setMsg(msg); handler.post(r); } } }.start(); }}
运行效果:
程序如有错误,欢迎指正,如有转载请注明出处。
0 0
- Android ListView 多条目动态更新进度 使用Handler callback 接口
- Handler+Callback更新UI
- 【Android】使用notifyDataSetChanged()动态更新ListView
- Android多线程中使用Handler更新ListView控件数据
- 在android中,如何使用Handler更新ListView组件Adapter?
- Android中Listview多条目
- Android ListView多条目展示
- android listview嵌套progreesbar更新进度 ftp
- 【Android】动态更新ListView
- 【Android】动态更新ListView
- Android Handler Callback
- 探讨Handler中的Callback接口
- Android实用工具类——ListView动态显示条目数目
- Android--------ListView多条目展示数据
- Android: ListView动态更新数据
- Android中动态更新ListView
- Android中动态更新ListView
- Android中动态更新ListView
- 解决getOutputStream() has already been called for this response
- 袁伟翔:数据库故障处理方法探讨
- 非IT文章收集
- 第7天——接口、Obect类、String类、==和equals
- 多媒体框架
- Android ListView 多条目动态更新进度 使用Handler callback 接口
- DataGridView直接导出EXCEL
- Windows远程桌面连接传送文件
- 你不是真正的快乐
- Precision and recall From Wiki
- Oracle 的物化视图(不积跬步,无以至千里)
- win 8.1下安装.NET 3.5不成功的解决方法
- 深入理解Java虚拟机读书笔记九
- 【成长访谈】李挺:用数学引领生活,品质无与伦比