package com.andbase.demo.adapter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import android.content.Context; import android.os.Environment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import com.ab.task.AbTask; import com.ab.task.AbTaskItem; import com.ab.task.AbTaskListener; import com.ab.util.AbFileUtil; import com.ab.util.AbStrUtil; import com.ab.util.AbToastUtil; import com.andbase.R; import com.andbase.global.Constant; import com.andbase.util.download.AbDownloadProgressListener; import com.andbase.util.download.AbDownloadThread; import com.andbase.util.download.AbFileDownloader; import com.andbase.util.download.DownFile; public class MyExpandableListAdapter extends BaseExpandableListAdapter { private static final String TAG = "MyExpandableListAdapter"; private static final boolean D = Constant.DEBUG; private Context mContext; private ArrayList<ArrayList<DownFile>> mDownFileGroupList = null; private String[] mDownFileGroupTitle = null; public HashMap<String,AbFileDownloader> mFileDownloaders = null; public MyExpandableListAdapter(Context context,ArrayList<ArrayList<DownFile>> downFileGroupList,String[] downFileGroupTitle){ this.mContext = context; mDownFileGroupList = downFileGroupList; mDownFileGroupTitle = downFileGroupTitle; mFileDownloaders = new HashMap<String,AbFileDownloader>(); } /** * 获取指定组位置、指定子列表项处的子列表项数据 */ @Override public Object getChild(int groupPosition, int childPosition) { return mDownFileGroupList.get(groupPosition).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public int getChildrenCount(int groupPosition) { return mDownFileGroupList.get(groupPosition).size(); } /** * 该方法决定每个子选项的外观 */ @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.down_items, parent, false); } final ViewHolder holder = new ViewHolder(); holder.itemsIcon = (ImageView) convertView.findViewById(R.id.itemsIcon); holder.itemsTitle = (TextView) convertView.findViewById(R.id.itemsTitle); holder.itemsDesc = (TextView) convertView.findViewById(R.id.itemsDesc); holder.operateBtn = (Button) convertView.findViewById(R.id.operateBtn); holder.progress = (ProgressBar) convertView.findViewById(R.id.received_progress) ; holder.received_progress_percent = (TextView) convertView.findViewById(R.id.received_progress_percent); holder.received_progress_number = (TextView) convertView.findViewById(R.id.received_progress_number); holder.received_progressBar = (RelativeLayout) convertView.findViewById(R.id.received_progressBar) ; holder.itemsIcon.setFocusable(false); holder.operateBtn.setFocusable(false); holder.progress.setFocusable(false); final DownFile mDownFile = (DownFile)getChild(groupPosition,childPosition); if (mDownFile != null) { //holder.itemsIcon.setImageResource(mDownFile.getIcon()); holder.itemsTitle.setText(mDownFile.getName()); holder.itemsDesc.setText(mDownFile.getDescription()); if(mDownFile.getState() == Constant.undownLoad){ holder.operateBtn.setBackgroundResource(R.drawable.down_load); holder.received_progressBar.setVisibility(View.GONE); holder.itemsDesc.setVisibility(View.VISIBLE); holder.progress.setProgress(0); holder.received_progress_percent.setText(0+"%"); holder.received_progress_number.setText("0KB/"+AbStrUtil.getSizeDesc(mDownFile.getTotalLength())); }else if(mDownFile.getState() == Constant.downInProgress){ holder.operateBtn.setBackgroundResource(R.drawable.down_pause); if(mDownFile.getDownLength()!=0 && mDownFile.getTotalLength()!=0){ int c = (int)(mDownFile.getDownLength()*100/mDownFile.getTotalLength()); holder.itemsDesc.setVisibility(View.GONE); holder.received_progressBar.setVisibility(View.VISIBLE); holder.progress.setProgress(c); holder.received_progress_percent.setText(c+"%"); holder.received_progress_number.setText(AbStrUtil.getSizeDesc(mDownFile.getDownLength())+"/"+AbStrUtil.getSizeDesc(mDownFile.getTotalLength())); } }else if(mDownFile.getState() == Constant.downLoadPause){ holder.operateBtn.setBackgroundResource(R.drawable.down_load); //下载了多少 if(mDownFile.getDownLength()!=0 && mDownFile.getTotalLength()!=0){ int c = (int)(mDownFile.getDownLength()*100/mDownFile.getTotalLength()); holder.itemsDesc.setVisibility(View.GONE); holder.received_progressBar.setVisibility(View.VISIBLE); holder.progress.setProgress(c); holder.received_progress_percent.setText(c+"%"); holder.received_progress_number.setText(AbStrUtil.getSizeDesc(mDownFile.getDownLength())+"/"+AbStrUtil.getSizeDesc(mDownFile.getTotalLength())); }else{ holder.itemsDesc.setVisibility(View.VISIBLE); holder.received_progressBar.setVisibility(View.GONE); holder.progress.setProgress(0); holder.received_progress_percent.setText(0+"%"); holder.received_progress_number.setText("0KB/"+AbStrUtil.getSizeDesc(mDownFile.getTotalLength())); } }else if(mDownFile.getState() == Constant.downloadComplete){ holder.operateBtn.setBackgroundResource(R.drawable.down_delete); holder.received_progressBar.setVisibility(View.GONE); holder.itemsDesc.setVisibility(View.VISIBLE); } final AbDownloadProgressListener mDownloadProgressListener = new AbDownloadProgressListener() { //实时获知文件已经下载的数据长度 @Override public void onDownloadSize(final long size) { if(mDownFile.getTotalLength()==0){ return; } final int c = (int)(size*100/mDownFile.getTotalLength()); if(c!=holder.progress.getProgress()){ holder.progress.post(new Runnable(){ @Override public void run() { holder.progress.setProgress(c); holder.received_progress_percent.setText(c+"%"); holder.received_progress_number.setText(AbStrUtil.getSizeDesc(size)+"/"+AbStrUtil.getSizeDesc(mDownFile.getTotalLength())); } }); } if(mDownFile.getTotalLength() == size){ if(D)Log.d(TAG, "下载完成:"+size); mDownFile.setState(Constant.downloadComplete); //下载完成 mDownFileGroupList.get(1).remove(mDownFile); mDownFileGroupList.get(0).add(mDownFile); holder.progress.post(new Runnable(){ @Override public void run() { notifyDataSetChanged(); } }); } } }; //处理按钮事件 holder.operateBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //无sd卡 AbToastUtil.showToast(mContext,"没找到存储卡"); return; } if(mDownFile.getState() == Constant.undownLoad || mDownFile.getState() == Constant.downLoadPause){ //下载 holder.itemsDesc.setVisibility(View.GONE); holder.received_progressBar.setVisibility(View.VISIBLE); holder.operateBtn.setBackgroundResource(R.drawable.down_pause); mDownFile.setState(Constant.downInProgress); AbTask mAbTask = new AbTask(); final AbTaskItem item = new AbTaskItem(); item.setListener(new AbTaskListener() { @Override public void update() { } @Override public void get() { try { //检查文件总长度 int totalLength = AbFileUtil.getContentLengthFromUrl(mDownFile.getDownUrl()); mDownFile.setTotalLength(totalLength); //开始下载文件 AbFileDownloader loader = new AbFileDownloader(mContext,mDownFile,1); mFileDownloaders.put(mDownFile.getDownUrl(), loader); loader.download(mDownloadProgressListener); } catch (Exception e) { e.printStackTrace(); } }; }); mAbTask.execute(item); }else if(mDownFile.getState()==Constant.downInProgress){ //暂停 holder.operateBtn.setBackgroundResource(R.drawable.down_load); mDownFile.setState(Constant.undownLoad); AbFileDownloader mFileDownloader = mFileDownloaders.get(mDownFile.getDownUrl()); //释放原来的线程 if(mFileDownloader!=null){ mFileDownloader.setFlag(false); AbDownloadThread mDownloadThread = mFileDownloader.getThreads(); if(mDownloadThread!=null){ mDownloadThread.setFlag(false); mFileDownloaders.remove(mDownFile.getDownUrl()); mDownloadThread = null; } mFileDownloader = null; } }else if(mDownFile.getState()==Constant.downloadComplete){ //删除 mDownFileGroupList.get(0).remove(mDownFile); mDownFile.setState(Constant.undownLoad); mDownFileGroupList.get(1).add(mDownFile); notifyDataSetChanged(); } } }); } return convertView; } /** * 获取指定组位置处的组数据 */ @Override public Object getGroup(int groupPosition) { return mDownFileGroupList.get(groupPosition); } @Override public int getGroupCount() { return mDownFileGroupList.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } /** * 该方法决定每个组选项的外观 */ @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.down_title, parent, false); } TextView mTextView = (TextView)convertView.findViewById(R.id.title_text); mTextView.setText(mDownFileGroupTitle[groupPosition]); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public boolean hasStableIds() { return true; } /** * 描述:释放线程 */ public void releaseThread() { Iterator it = mFileDownloaders.entrySet().iterator(); AbFileDownloader mFileDownloader = null; while (it.hasNext()) { Map.Entry e = (Map.Entry) it.next(); mFileDownloader = (AbFileDownloader)e.getValue(); //System.out.println("Key: " + e.getKey() + "; Value: " + e.getValue()); if(mFileDownloader!=null){ mFileDownloader.setFlag(false); AbDownloadThread mDownloadThread = mFileDownloader.getThreads(); if(mDownloadThread!=null){ mDownloadThread.setFlag(false); mDownloadThread = null; } mFileDownloader = null; } } } public class ViewHolder { public ImageView itemsIcon; public TextView itemsTitle; public TextView itemsDesc; public Button operateBtn; public ProgressBar progress; public TextView received_progress_percent; public TextView received_progress_number; public RelativeLayout received_progressBar; } }