当前位置: 代码迷 >> Android >> 求教,使用handler刷新list的有关问题
  详细解决方案

求教,使用handler刷新list的有关问题

热度:77   发布时间:2016-05-01 21:33:31.0
求教,使用handler刷新list的问题
总共六个文件,实现一个list,点击后能够下载,并显示进度。
但是每次执行时在后台看到整个文件下载完了,进度条才会更新。。
首先是一个activity,承载list并获取数据。
Java code
public class MapDownActivity extends Activity {    private ListView list;    private static final String Path = "http://192.168.1.125:8080/MapServer/mapServer.do?para=getMapList";    private MapListAdapter adapter;    private ProgressBar pb;    @Override    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 {    Activity a;    List<MapListItem> values;    MapListControlHandler handler;    private ProgressBar pb;    private Context context;    public MapListAdapter(Activity a, List<MapListItem> values,            ProgressBar pb,Context context) {        this.a = a;        this.values = values;        this.pb = pb;        this.context=context;    }    public void addItem(MapListItem item) {        values.add(item);    }    @Override    public int getCount() {        return values.size();    }    @Override    public MapListItem getItem(int arg0) {        return values.get(arg0);    }    public void setItem(MapListItem item, int arg0) {        values.set(arg0, item);        notifyDataSetChanged();    }    @Override    public long getItemId(int arg0) {        return arg0;    }    @Override    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());        return view;    }}

handler的处理部分
Java code
public void handleMessage(Message msg) {        if (!Thread.currentThread().isInterrupted()) {            switch (msg.what) {            case 0:                Toast.makeText(context, "已加入下载队列", 1).show();                pb.setVisibility(View.VISIBLE);                break;            case 1:                pb.setProgress(msg.arg1);                break;            case 2:                pb.setProgress(100);                pb.setVisibility(View.INVISIBLE);                pb.setProgress(0);                item.setStatus("下载完成");                adapter.setItem(item, position);                break;            default:                break;            }        }    }

下载文件部分
Java code
private void writeToDevice(String content, String name, Handler handler) {        Message message = new Message();        message.what = 0;        handler.sendMessage(message);                OutputStream outputStream;        int DownedFileLength = 0;        String savePathString = mapdir + name + ".000";        Log.i("下载文件------------>", name);        try {            File file = new File(savePathString);            if (!file.exists()) {                file.createNewFile();            }            outputStream = new FileOutputStream(file);            byte[] buffer = content.getBytes("ISO-8859-1");            int FileLength = buffer.length;            int count = 1024 * 4;            while (DownedFileLength < FileLength) {                if (DownedFileLength + count > FileLength)                    count = FileLength - DownedFileLength;                outputStream.write(buffer, DownedFileLength, count);                message = new Message();                message.what = 1;                message.arg1 = (int) ((int) DownedFileLength * 100 / FileLength);                handler.sendMessage(message);                DownedFileLength += count;            }            outputStream.close();            message = new Message();            message.what = 2;            handler.sendMessage(message);        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }
  相关解决方案