先上效果图
这里贴下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编码