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
原创粉丝点击