下载任务和任务调度部分代码之前已经发过了,这里只发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));至此,多任务下载框架已经分析完毕。有需要相关代码的,可以私信我。谢谢~
原创不易,如果您觉得好,可以分享此公众号给你更多的人。