多任务下载框架Demo的运用

下载任务和任务调度部分代码之前已经发过了,这里只发UI相关部分代码:

 
/**
 * <The trouble with the world is that the stupid are sure and the intelligent are full of doubt.>
 * <p>
 * HappyBaby
 * <p>
 * 作者:Jacky.Ao on 2018/2/26 15:23
 * <p>
 * 邮箱: jiazhi.ao@gmail.com
 */

public class ResourceFragment extends Fragment implements
        ResourceListViewAdapter.OnDeleteClickListener, ResourceListViewAdapter.OnItemClickListener  {

    @Bind(R.id.download_tab)
    Button downloadTab;
    @Bind(R.id.downloading_tab)
    Button downloadingTab;
    @Bind(R.id.download_listview)
    RecyclerView downloadListview;
    private int hlIndex = 1;

    private ResourceListViewAdapter resourceListViewAdapter;
    private TaskDispatcher taskDispatcher;

    public ResourceFragment() {
        // Required empty public constructor
    }


    public static ResourceFragment newInstance() {
        return new ResourceFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_resource, container, false);
        ButterKnife.bind(this, view);
        init();
        return view;
    }

    private void init() {
        taskDispatcher = TaskDispatcher.getInstance();
        downloadListview.setLayoutManager(new WrapLinearLayoutManager(getActivity()));
        downloadListview.setItemAnimator(new DefaultItemAnimator());
        downloadListview.addItemDecoration(new RecycleViewDivider(getActivity(), LinearLayoutManager.VERTICAL));
        resourceListViewAdapter = new ResourceListViewAdapter(getContext(),
                hlIndex == 0 ? taskDispatcher.getDownloadedList() : taskDispatcher.getQueueTaskList(), this, this);
        downloadListview.setAdapter(resourceListViewAdapter);
        if (hlIndex == 0) {
            downloadTab.setBackgroundResource(R.drawable.tab_radius_left);
            downloadingTab.setBackgroundResource(android.R.color.transparent);
        } else {
            downloadingTab.setBackgroundResource(R.drawable.tab_radius_right);
            downloadTab.setBackgroundResource(android.R.color.transparent);
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.unbind(this);
    }

    @OnClick({R.id.download_tab, R.id.downloading_tab})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.download_tab:
                updateTabUI(R.id.download_tab);
                break;
            case R.id.downloading_tab:
                updateTabUI(R.id.downloading_tab);
                break;
        }
    }

    private void updateTabUI(int resId) {
        if (R.id.download_tab == resId) {
            if (hlIndex == 0) {
                return;
            } else {
                hlIndex = 0;
                downloadTab.setBackgroundResource(R.drawable.tab_radius_left);
                downloadingTab.setBackgroundResource(android.R.color.transparent);
                updateDataChanged();
            }
        } else if(R.id.downloading_tab == resId) {
            if (hlIndex == 1) {
                return;
            } else {
                hlIndex = 1;
                downloadingTab.setBackgroundResource(R.drawable.tab_radius_right);
                downloadTab.setBackgroundResource(android.R.color.transparent);
                updateDataChanged();
            }
        }
    }

    public void updateDataChanged() {
        if (resourceListViewAdapter != null && downloadListview != null) {
            resourceListViewAdapter.updateData(hlIndex == 0 ? TaskDispatcher.getInstance().getDownloadedList()
                    : TaskDispatcher.getInstance().getQueueTaskList());
            downloadListview.setAdapter(resourceListViewAdapter);
            resourceListViewAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onItemClick(int position) {
        Toast.makeText(getContext(), position + "序号", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDelete(int position) {
        List<DownloadTask> taskList = hlIndex == 0 ? TaskDispatcher.getInstance().getDownloadedList() : TaskDispatcher.getInstance().getQueueTaskList();
        TaskDispatcher.getInstance().deleteTask(taskList.get(position), hlIndex == 0 ? true : false);
        resourceListViewAdapter.notifyItemRemoved(position);
    }
}


 主要显示2个列表,正在现在列表和已下载列表。

布局文件fragment_resource.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.afasion.happybaby.ui.fragment.ResourceFragment">

    <!-- TODO: Update blank fragment layout -->
    <include layout="@layout/res_top_layout" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/download_listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

res_top_layout.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:background="@drawable/djdzt_tab_bg_down" >

    <LinearLayout
        android:layout_width="200dp"
        android:layout_height="30dp"
        android:layout_centerInParent="true"
        android:layout_weight='1'
        android:background="@drawable/tab_border"
        android:orientation="horizontal">

        <Button
            android:id="@+id/download_tab"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:background="@drawable/tab_radius_left"
            android:text="@string/downloaded" />

        <Button
            android:id="@+id/downloading_tab"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:background="@android:color/transparent"
            android:text="@string/downloading" />
    </LinearLayout>

</RelativeLayout>

RecyclerView适配器代码:
public class ResourceListViewAdapter extends RecyclerView.Adapter<ResourceListViewAdapter.ResourceViewHolder>
        implements SlideView.OnSlideListener  {
    private Context context;
    private List<DownloadTask> downloadTaskList;
    private SlideView lastOpenSlideView;
    private OnDeleteClickListener deleteClickListener;
    private ResourceFragment resourceFragment;
    private OnItemClickListener onItemClickListener;

    public ResourceListViewAdapter(Context context, List<DownloadTask> data, OnDeleteClickListener listener, ResourceFragment fragment) {
        this.context = context;
        downloadTaskList = data;
        deleteClickListener = listener;
        resourceFragment = fragment;
    }

    public void updateData(List<DownloadTask> data) {
        downloadTaskList = data;
    }

    @Override
    public ResourceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        SlideView view = (SlideView) LayoutInflater.from(context).inflate(R.layout.res_list_item_layout, null);
        view.setOnSlideListener(this);
        return new ResourceViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ResourceViewHolder holder, int position) {
        DownloadTask task = downloadTaskList.get(position);
        MusicEntity entity = (MusicEntity) task.getDownloadObject();
        if (entity != null) {
            if (entity.equals("1")) {
                holder.item_header.setImageResource(R.drawable.icon_erge);
            } else if (entity.getPid().equals("2")) {
                holder.item_header.setImageResource(R.drawable.ic_history);
            } else if (entity.getPid().equals("3")) {
                holder.item_header.setImageResource(R.drawable.ic_english);
            } else if (entity.getPid().equals("4")) {
                holder.item_header.setImageResource(R.drawable.ic_sleep);
            }
            holder.name.setText(entity.getName());
        }
        if (task.getState() == DownloadTask.STATE.PENDING) {
            holder.pending.setVisibility(View.VISIBLE);
            holder.progress.setVisibility(View.GONE);
        } else if (task.getState() == DownloadTask.STATE.FINISHED) {
            holder.progress.setVisibility(View.GONE);
            holder.pending.setVisibility(View.VISIBLE);
            holder.pending.setImageResource(R.drawable.bd_btn_downloaded);
        } else if (task.getState() == DownloadTask.STATE.LOADING) {
            holder.progress.setVisibility(View.VISIBLE);
            holder.pending.setVisibility(View.GONE);
        } else if (task.getState() == DownloadTask.STATE.FAILED) {
            holder.progress.setVisibility(View.GONE);
            holder.pending.setVisibility(View.VISIBLE);
            holder.pending.setImageResource(R.drawable.ic_fail);
        }
        task.setOnProgressListener(new DownloadTask.OnProgressListener() {
            @Override
            public void onProgress(long addedBytes, long contentLenght, boolean done) {
                if (contentLenght > 0) {
                    holder.progress.setProgress((int) (1.0f * addedBytes / contentLenght * 100));
                }
                if (done || addedBytes == 0) {
                    Log.i(entity.getName() + " finished...");
                    //notifyItemRemoved(position);
                    resourceFragment.updateDataChanged();
                }
            }
        });

        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (deleteClickListener != null) {
                    deleteClickListener.onDelete(position);
                }
            }
        });
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
    }

    @Override
    public int getItemCount() {
        return downloadTaskList.size();
    }

    @Override
    public void onSlide(View view, int status) {
        if (lastOpenSlideView != null && lastOpenSlideView != view) {
            lastOpenSlideView.shrink();
        }
        if (status == SLIDE_STATUS_ON) {
            lastOpenSlideView = (SlideView) view;
        }
    }

    public class ResourceViewHolder extends RecyclerView.ViewHolder {
        private ImageView delete;
        private ImageView item_header;
        private TextView name;
        private CircleProgress progress;
        private ImageView pending;

        public ResourceViewHolder(View itemView) {
            super(itemView);
            delete = itemView.findViewById(R.id.delete);
            item_header = itemView.findViewById(R.id.item_header);
            name = itemView.findViewById(R.id.name);
            progress = itemView.findViewById(R.id.progress);
            pending = itemView.findViewById(R.id.pending);
        }
    }

    public interface OnDeleteClickListener {
        void onDelete(int position);
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }
}



主要分析下onBindViewHolder函数,从下载队列里取出下载任务对象,通过getDownloadObject接口获取下载实体类,设置下载监听器setOnProgressListener,实现OnProgress接口,更新下载进度控件。holder.progress.setProgress((int) (1.0f * addedBytes / contentLenght * 100));至此,多任务下载框架已经分析完毕。有需要相关代码的,可以私信我。谢谢~

原创不易,如果您觉得好,可以分享此公众号给你更多的人。





                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值