一个很简单的文件选择器对话框,支持双sd卡,当然前提是要有sd卡。。并且实现了排序效果.

只有100多行的代码,基本的思路就是用listview显示目录下的所有子文件,再判断是文件还是目录。

利用Collections.sort方法进行排序。

代码如下:

 package net.yunstudio.demo;

 import java.io.File;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map; import android.app.Dialog;
import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter; public class FilePickerDialog extends Dialog implements OnItemClickListener{ public FilePickerDialog(Context context) {
super(context);
init();
} private ListView lv_file;
private SimpleAdapter simpleAdapter;
private List<Map<String, Object>> dataList;
private OnFileSelectListener listener;
//通过获取sd卡的父级,可以兼容双sd卡的情况
private static final File rootPath=
Environment.getExternalStorageDirectory().getParentFile(); private static final String SRC="src";
private static final String NAME="name";
private static final String FILE="file";
private static final String IS_BAK="isBak"; private void init() {
getChildren2dataList(rootPath);
simpleAdapter=new SimpleAdapter(getContext(),dataList , R.layout.list_item_choosefile,
new String[]{SRC,NAME}, new int[]{R.id.iv_file_type,R.id.tv_file_name}); lv_file=new ListView(getContext());
lv_file.setAdapter(simpleAdapter);
lv_file.setOnItemClickListener(this);
setContentView(lv_file); setCanceledOnTouchOutside(true);
this.setTitle("请选择文件");
}
/**
* 设置选择文件的监听器
* @param listener
*/
public void setOnFileSelectListener(OnFileSelectListener listener) {
this.listener = listener;
}
/**
* 将本目录的子文件的信息赋值给dataList字段
* @param dir
*/
private void getChildren2dataList(File dir) {
File[] children=dir.listFiles();
if(dataList==null){
dataList=new ArrayList<Map<String,Object>>();
}else {
dataList.clear();
} if(!rootPath.equals(dir)){
Map<String, Object> map=new HashMap<String, Object>();
map.put(SRC, R.drawable.folder);
map.put(NAME, "..");
map.put(FILE, dir.getParentFile());
map.put(IS_BAK, true);
dataList.add(map);
}
if(children==null) return ;//避免空目录引起的空指针错误
for (File file : children) {
Map<String, Object> map=new HashMap<String, Object>();
map.put(SRC, file.isDirectory()
?R.drawable.folder
:R.drawable.file);
map.put(NAME, file.getName());
map.put(FILE, file);
dataList.add(map);
} Collections.sort(dataList, new Comparator<Map<String, Object>>() { @Override
public int compare(Map<String, Object> lhs, Map<String, Object> rhs) {
int result=0; if(lhs.get(IS_BAK)!=null){
result = -1;
}else if (rhs.get(IS_BAK)!=null) {
result = 1;
}else {
File lhsFile=(File) lhs.get(FILE);
File rhsFile=(File) rhs.get(FILE); if(lhsFile.isDirectory()&&rhsFile.isFile()){
result = -1;
}else if (lhsFile.isFile()&&rhsFile.isDirectory()) {
result = 1;
}else {
Collator cmp = Collator.getInstance(Locale.getDefault());
result = cmp.compare(lhs.get(NAME), rhs.get(NAME));
}
}
return result;
}
});
} @Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
File file=(File)dataList.get(position).get(FILE);
if(file.isDirectory()){
getChildren2dataList(file);
simpleAdapter.notifyDataSetChanged();
}else {
if(listener!=null){
listener.onFileSelect(file);
this.dismiss();
}
}
} public static interface OnFileSelectListener{
void onFileSelect(File file);
}
}

项目下载地址:点击下载

也发一个自己实现的android简单文件选择器代码。支持多卡,排序的更多相关文章

  1. Android简单文件浏览器源代码 (转)

    Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ...

  2. Android第三方文件选择器:aFileChooser

     Android第三方文件选择器:aFileChooser aFileChooser是Android平台上的一个第三方文件选择器,其在github上的项目主页是:https://github.co ...

  3. Android Zip文件解压缩代码

    2011-04-01 17:58:52|  分类: Android |举报 |字号 订阅   在Android平台中如何实现Zip文件的解压 缩功能呢? 因为Android内部已经集成了zlib库,对 ...

  4. android 简单文件操作

    1.布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  5. Android NDK开发之Android.mk文件

    Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南   Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...

  6. Android.mk文件语法规范及使用模板

    Android.mk文件语法详述 介绍:------------这篇文档是用来描述你的C或C++源文件中Android.mk编译文件的语法的,为了理解她们我们需要您先看完docs/OVERVIEW.h ...

  7. Android 简单计算器源码....

    PS:今天算是闲着没事做了一个小型的计算器...顺便熟悉一下Android的布局,组件,以及时间监听的方法...就当是做了一个小小的练习吧...     顺便去对比了一下别人写的代码...有的使用到了 ...

  8. webview之如何设计一个优雅健壮的Android WebView?(下)(转)

    转载:https://iluhcm.com/2018/02/27/design-an-elegant-and-powerful-android-webview-part-two/ (这篇文章写得有点晚 ...

  9. 如何设计一个优雅健壮的Android WebView?(下)

    转:如何设计一个优雅健壮的Android WebView?(下) 前言 在上文<如何设计一个优雅健壮的Android WebView?(上)>中,笔者分析了国内WebView的现状,以及在 ...

随机推荐

  1. [原]POJ1141 Brackets Sequence (dp动态规划,递归)

    本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ...

  2. linux中的audit审计日志

    这里首先介绍auditctl的应用,具体使用指南查看man auditctl.auditctl的man 描述说明这个工具主要是用来控制audit系统行为,获取audit系统状态,添加或者删除audit ...

  3. Oracle数据库中的Function调用参数问题

    在工作中用到了Oracle数据库,需要调用Oracle的Function,Function返回的游标和结果都是通过参数来获取的 比如Function定义如下: , intype, ininttype) ...

  4. C#中如何将combox中的下拉项和一个枚举中的各项进行绑定

    实现一个combobox,将其各个下拉项与枚举进行绑定 效果图如下: 代码详解如下: 枚举: public enum StoreSite { /// <summary> /// 未知 // ...

  5. PHP伪造referer突破防盗链

    php伪造referer实例代码,主要用于一些突破防盗链. 可以从这个例子中发展出很多的应用.比如隐藏真实的URL地址……嘿嘿,具体的就自己分析去吧 这里新建一个文件file.php.后面的参数就是需 ...

  6. Ubuntu 14.04 安装flash插件

    分别tar.gz和apt-get方法 第一种: adboe官网下载tar.gz,进入terminal 1.解压缩包,输入命令“tar -zxvf 软件包名字” 2.拷贝插件到mozilla目录,输入命 ...

  7. Flex 4.0及4.6发布的网络应用在内网内会访问很慢的解决方案

    Flex 4.x 开发的程序部署在外网在能访问到www.adobe.com的时能够很快加载完成,但是部署在本地局域网,不能访问外网的服务器上,用浏览器访问应用需要加载几分钟的时间,这种等待时间客户几乎 ...

  8. JLINK V8 Keil MDK4.10 STM32

    新买的JLINK v8仿真器,第一次使用,编译环境是Keil MDK4.10,目前芯片是STM32F103x. 按照光盘的说明先安装了驱动,USB接上JLINK v8,显示驱动成功.但是在debug或 ...

  9. 使用supervisor的一些注意事项

    一直都有在使用supervisor来管理linux上的服务进程.最近有同事说有某服务貌似有问题,让上去检查一下.上去以后发现某服务反应的确很慢,所以就用supervisor重启一下.但是重启的时候就发 ...

  10. 动态加载故事storyboard

    第一种方法: ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"Name o ...