listview中用service多线程断点续传下载,并解决button顺序错乱问题

先上效果图
这里写图片描述
这里贴下FileListAdapter的代码:

public class FileListAdapter extends BaseAdapter {

    private List<FileInfo> fileInfoList;
    private ViewHolder holder;
    private LayoutInflater mInflater;
    private Context context;
    private int currentPosition = 0;
    public String isDown[];
    private String download = "下载";
    private String isDowning = "正在下载";
    private String install = "安装";
    private String isInstall = "安装完成";

    public FileListAdapter(Context context, List<FileInfo> fileInfoList) {
        this.context = context;
        this.fileInfoList = fileInfoList;
        this.mInflater = LayoutInflater.from(context);
        isDown = new String[fileInfoList.size()];
        for (int i = 0; i < isDown.length; i++) {
            isDown[i] = download;
        }
    }

    @Override
    public int getCount() {
        return fileInfoList.size();
    }

    @Override
    public Object getItem(int position) {
        return fileInfoList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final FileInfo fileInfo = fileInfoList.get(position);
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder.fileNameText = (TextView) convertView
                    .findViewById(R.id.down_text);
            holder.downBtn = (Button) convertView.findViewById(R.id.down_btn);
            holder.downProgress = (ProgressBar) convertView
                    .findViewById(R.id.down_proBar);


            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.downBtn.setOnClickListener(new btnListener(position,
                holder.downBtn));
        holder.fileNameText.setText(fileInfo.getFileName());
        holder.downProgress.setMax(100);
        holder.downProgress.setProgress(fileInfo.getFinished());

        if (isDown[position].equals(download)) {
            holder.downBtn.setText(download);
            holder.downBtn.setEnabled(true);
        } else if (isDown[position].equals(isDowning)){
            holder.downBtn.setText(isDowning);
        }else if (isDown[position].equals(install)){
            holder.downBtn.setText(install);
        }else if(isDown[position].equals(isInstall)){
            holder.downBtn.setText(isInstall);
            holder.downBtn.setEnabled(false);
        }
        convertView.setTag(holder);

        return convertView;
    }

    class btnListener implements OnClickListener {
        private int position;
        private Button Btn;

        public btnListener(int position, Button currentBtn) {
            this.position = position;
            this.Btn = currentBtn;
        }

        @Override
        public void onClick(View v) {
            currentPosition = position;

            final FileInfo fileInfo = fileInfoList.get(currentPosition);
            if (isDown[position].equals(download)) {
                Intent intent = new Intent(context, DownloadService.class);
                intent.setAction(DownloadService.ACTION_START);
                intent.putExtra("fileInfo", fileInfo);
                context.startService(intent);
                isDown[position] = isDowning;
                Btn.setText(isDowning);
            } else if (isDown[position].equals(isDowning)){
                Intent intent = new Intent(context, DownloadService.class);
                intent.setAction(DownloadService.ACTION_STOP);
                intent.putExtra("fileInfo", fileInfo);
                context.startService(intent);
                isDown[position] = download;
                Btn.setText(download);
            }else if (isDown[currentPosition].equals(install)){
                String zipFilePath = fileInfo.getFilePath();
                File zipFile = new File(zipFilePath);
                try
                {
                    ZipUtil.unZipFileWithProgress(zipFile, Environment.getExternalStorageDirectory().toString()+"/downloads/test/"+fileInfo.getFileName(), handler,
                            false);
                }
                catch (ZipException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

    public void setButton(int position){
        fileInfoList.get(position).setFinished(100);
        isDown[position] = "安装";
    }

    public void updateProgress(int id,int progress){
        FileInfo fileInfo = fileInfoList.get(id);
        fileInfo.setFinished(progress);
        notifyDataSetChanged();
    }


    private static class ViewHolder {
        TextView fileNameText;
        Button downBtn;
        ProgressBar downProgress;
    }

    private Handler handler = new Handler()
    {
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
            case CompressStatus.START:

                break;
            case CompressStatus.HANDLING:

                break;
            case CompressStatus.COMPLETED:
                Toast.makeText(context,fileInfoList.get(currentPosition).getFileName()+"安装完成",Toast.LENGTH_SHORT).show();
                isDown[currentPosition] = isInstall;
                notifyDataSetChanged();
                break;
            case CompressStatus.ERROR:

                break;
            }
        };
    };
}

多线程下载参照此视频http://www.imooc.com/learn/376

位置错乱由于是因为index错误造成的,那么只要保证index值与当前positon保持一至即可,只要把添加监听器的方法加到初始化button状态的代码之前即可.

源码下载地址http://download.csdn.net/detail/chinawallace/8850249
采用utf-8编码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值