如果需要让用户选择文件,可以使用如下方法将SD卡上的文件显示到一个ListActivity供用户选择。
1 定义个一个方法,可以得到一个路径下所有的文件和文件夹,并对其排序,使文件在文件夹后面,并将结果传到一个ListView的Adapter构造方法中:
public void getFiles(String path){
tv.setText(path);
File f=new File(path);
//得到所有子文件和文件夹
File[] tem=f.listFiles();
//如果当前的目录不是在顶层目录,就把父目录要到files数组中的第一个
if(!path.equals(root)){
files=new File[tem.length+1];
System.arraycopy(tem, 0, files, 1, tem.length);
files[0]=f.getParentFile();
}else{
files=tem;
}
sortFilesByDirectory(files);
//为ListActivity设置Adapter
setListAdapter(new Adapter(this, files,files.length==tem.length));
}
其中排序方法的代码如下:
//对文件进行排序
private void sortFilesByDirectory(File[] files) {
Arrays.sort(files, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.valueOf(f1.length()).compareTo(f2.length());
}
});
}
2 定义一个ListView的Adapter继承BaseAdapter,构造方法接受三个参数:Context(上下文), File[](要显示的文件),boolean(是否为顶层目录):
public Adapter(Context context,File[] files, boolean istop) {
this.context=context;
this.files = files;
this.istop = istop;
}
Adapter中getView的方法如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder=null;
if(convertView==null){
holder=new Holder();
convertView=View.inflate(context, R.layout.adapter, null);
holder.iv=(ImageView) convertView.findViewById(R.id.adapter_icon);
holder.tv=(TextView) convertView.findViewById(R.id.adapter_txt);
convertView.setTag(holder);
}else{
holder=(Holder) convertView.getTag();
}
//设置convertView中控件的值
setconvertViewRow( position, holder);
return convertView;
}
其中Holder类定义:
class Holder{
private ImageView iv;
private TextView tv;
}
setconvertViewRow方法定义如下:
private void setconvertViewRow(int position,Holder holder ){
File f=files[position];
holder.tv.setText(f.getName());
if(!istop && position==0){//不是在顶层目录
//加载后退图标
holder.iv.setImageResource(R.drawable.back);
}else if(f.isFile()){//是文件
//加载文件图标
holder.iv.setImageResource(R.drawable.file);
}else{//文件夹
//加载文件夹图标
holder.iv.setImageResource(R.drawable.dir);
}
}
3 在程序开始的时候就可以调用getFiles方法,传入参数“/sdcard”就可以拉,结果如下:
下载代码