okgo框架,实现多用户下载列表显示

运行效果图如下


可实现暂停,继续,断点续传,侧滑删除,点击弹出可打开的应用提示框。

1.主要运用okgo 2.0框架,根据下载的tag 拼接上用户id,根据用户id筛选下载集合数据,达到展示不同用户的下载列表。

关键代码如下:

package com.example.download.utils;

import android.content.Context;
import android.os.Environment;

import com.example.download.model.CourseModel;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.request.GetRequest;
import com.lzy.okserver.download.DownloadManager;
import com.lzy.okserver.download.DownloadService;

import java.io.File;

/**
 * Created by fugang on 2018/3/20.
 */

public class DownloadUtils {

    public static  void download(CourseModel courseModel) {
        DownloadManager downloadManager = DownloadService.getDownloadManager();
        GetRequest request = OkGo.get(courseModel.courseAddress)//
                .headers("headerKey1", "headerValue1")//
                .headers("headerKey2", "headerValue2")//
                .params("paramKey1", "paramValue1")//
                .params("paramKey2", "paramValue2");
        String userId=courseModel.getUserId();
        String tag=courseModel.courseAddress+"userId="+userId;
        downloadManager.setTargetFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + "/kzkt/"+userId);
        downloadManager.addTask(tag, courseModel, request, null);
    }
    public static String getMIMEType(Context context, String filePath) {
        String type="";
        File file = new File(filePath);
        String fileName = file.getName().trim().toLowerCase();
        if(fileName.endsWith("pdf")){
            type="application/pdf";
        }else if (fileName.endsWith("mp4")){
            type="video/*";
        }else {
            type="video/*";
        }
        return type;
    }
}

下载队列downloadadapter 适配器:

package com.example.download;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.support.v4.content.FileProvider;
import android.support.v7.widget.RecyclerView;
import android.text.format.Formatter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.example.download.model.CourseModel;
import com.example.download.utils.DownloadUtils;
import com.example.download.utils.SPTool;
import com.lzy.okserver.download.DownloadInfo;
import com.lzy.okserver.download.DownloadManager;
import com.lzy.okserver.download.DownloadService;
import com.lzy.okserver.listener.DownloadListener;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;


public class DownloadAdapter extends RecyclerView.Adapter<DownloadAdapter.ViewHolder> {

    private List<DownloadInfo> allTask;
    private NumberFormat numberFormat;
    private LayoutInflater inflater;
    private Context context;
    private DownloadManager downloadManager;
    private DownloadInfo downloadInfo;
    private String userId;

    public DownloadAdapter(Context context) {
        this.context = context;
        numberFormat = NumberFormat.getPercentInstance();
        numberFormat.setMinimumFractionDigits(2);
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void updateData() {
        downloadManager = DownloadService.getDownloadManager();
        getListData();
        notifyDataSetChanged();
    }

    //获取单个用户下载列表数据
    public List<DownloadInfo> getListData() {
        allTask = new ArrayList<DownloadInfo>();
//        SharedPreferences preferences = context.getSharedPreferences("userInfo",
//                Activity.MODE_PRIVATE);
//        String userInfo = preferences.getString("userInfo", "");
//        try {
//            JSONObject userInfoJson = new JSONObject(userInfo);
//            userId = userInfoJson.getString("empNo");
//
//        } catch (JSONException e) {
//            e.printStackTrace();
//        }
        userId= (String) SPTool.get(context,"userId","");
        for (int i = 0; i < downloadManager.getAllTask().size(); i++) {
            DownloadInfo downloadInfo = downloadManager.getAllTask().get(i);
            Log.e("fff", "tag=" + downloadInfo.getTaskKey());
            Log.e("fff", "userId=" + userId);
            if (downloadInfo.getTaskKey().endsWith(userId)) {
                allTask.add(downloadInfo);
            }
        }
        return allTask;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_download_manager, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        downloadInfo = allTask.get(position);
        holder.bind(downloadInfo);
        holder.refresh(downloadInfo);
        DownloadListener downloadListener = new ListDownloadListener();
        downloadListener.setUserTag(holder);
        downloadInfo.setListener(downloadListener);
    }

    @Override
    public int getItemCount() {
        Log.e("downloadlist", "" + allTask.size());
        return allTask == null ? 0 : allTask.size();

    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView icon;
        public TextView name;
        public TextView downloadSize;
        public TextView netSpeed;
        public NumberProgressBar pbProgress;
        private CheckBox checkBox;
        private DownloadInfo downloadInfo;


        public void refresh(DownloadInfo downloadInfo) {
            this.downloadInfo = downloadInfo;
            refresh();
        }

        public ViewHolder(View itemView) {
            super(itemView);
            icon = (ImageView) itemView.findViewById(R.id.icon);
            name = (TextView) itemView.findViewById(R.id.name);
            downloadSize = (TextView) itemView.findViewById(R.id.downloadSize);
            pbProgress = (NumberProgressBar) itemView.findViewById(R.id.pbProgress);
            netSpeed = (TextView) itemView.findViewById(R.id.netSpeed);
            checkBox = (CheckBox) itemView.findViewById(R.id.checkbox);
            //选中事件
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    String tag = downloadInfo.getUrl() + "userId=" + userId;
                    if (b) {
                        checkBox.setChecked(true);
                        downloadManager.addTask(tag, downloadInfo.getRequest(), downloadInfo.getListener());
                        Log.e("downloadlist", "开始下载:" + b);
                    } else {
                        checkBox.setChecked(false);
                        downloadManager.pauseTask(tag);
                        Log.e("downloadlist", "暂停下载:" + b);
                    }

                    refresh();
                }
            });
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (downloadInfo.getState() == DownloadManager.FINISH) {
                        Intent intent = new Intent();
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent.setAction(Intent.ACTION_VIEW);
                        String type = DownloadUtils.getMIMEType(context, downloadInfo.getTargetPath());
                        File file = new File(downloadInfo.getTargetPath());
                        //设置intent的data和Type属性。
                        Uri url = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", file);
                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        intent.setDataAndType(url, type);
                        context.startActivity(intent);
                    }
                }
            });

        }


        public void bind(DownloadInfo downloadInfo) {
            CourseModel courseModel = (CourseModel) downloadInfo.getData();
            if (courseModel != null) {
                Glide.with(context).load(courseModel.courseCover).error(R.mipmap.ic_launcher).into(icon);
                name.setText(courseModel.courseTitle);
            }
        }

        public void refresh() {
            String downloadLength = Formatter.formatFileSize(context, downloadInfo.getDownloadLength());
            String totalLength = Formatter.formatFileSize(context, downloadInfo.getTotalLength());
            downloadSize.setText(downloadLength + "/" + totalLength);
            if (downloadInfo.getState() == DownloadManager.NONE) {
                netSpeed.setText("已暂停");
                checkBox.setChecked(false);
            } else if (downloadInfo.getState() == DownloadManager.PAUSE) {
                netSpeed.setText("已暂停");
                checkBox.setChecked(false);
            } else if (downloadInfo.getState() == DownloadManager.ERROR) {
                netSpeed.setText("下载失败");
                checkBox.setChecked(false);
            } else if (downloadInfo.getState() == DownloadManager.WAITING) {
                netSpeed.setText("等待中");
                checkBox.setChecked(true);
            } else if (downloadInfo.getState() == DownloadManager.FINISH) {
                netSpeed.setText("下载完成");
                checkBox.setVisibility(View.INVISIBLE);
            } else if (downloadInfo.getState() == DownloadManager.DOWNLOADING) {
                netSpeed.setText("下载中");
                checkBox.setChecked(true);
            }
            //显示下载百分比
            pbProgress.setMax(10000);
            pbProgress.setProgress((int) (downloadInfo.getProgress() * 10000));
        }


    }

    //删除列表数据
    public void remove(DownloadInfo downloadInfo) {
        String tag = downloadInfo.getUrl() + "userId=" + userId;
        downloadManager.removeTask(tag, true);
        Log.e("downloadlist", "remove:" + downloadInfo.getUrl());
        updateData();
    }

    public class ListDownloadListener extends DownloadListener {

        @Override
        public void onProgress(DownloadInfo downloadInfo) {
            if (getUserTag() == null) return;
            ViewHolder holder = (ViewHolder) getUserTag();
            holder.refresh();  //这里不能使用传递进来的 DownloadInfo,否者会出现条目错乱的问题
        }

        @Override
        public void onFinish(DownloadInfo downloadInfo) {
            Toast.makeText(context, "下载完成:" + downloadInfo.getTargetPath(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(DownloadInfo downloadInfo, String errorMsg, Exception e) {
            if (errorMsg != null) Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show();
        }
    }
}

点击源码链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值