一个很简单的文件选择器对话框,支持双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. 关于fork函数中的内存复制和共享

    原来刚刚开始做linux下面的多进程编程的时候,对于下面这段代码感到很奇怪, #include<unistd.h> #include<stdio.h> #include< ...

  2. IOS中UIKit——UIButton的背景图像无法正常显示的原因

    主要是在将图像引入项目中,没有选择Destination:Copy items if needed一项. 没有选择Destination:Copy items if needed一项,图像只能是以链接 ...

  3. ES2015 ——let命令的暂时性死区

    ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. 和var不同的还有,let命令不存在变量提升,所以声明前调用变量,都会报错,这就涉及到 ...

  4. input实时监听(input oninput propertychange onpropertychange)

    本文实例讲述了js与jquery实时监听输入框值的oninput与onpropertychange方法.分享给大家供大家参考.具体如下: 最近做过一个项目,需求是下拉框里自动匹配关键字,具体细节是实时 ...

  5. Windows程序设计之Hello,Windows 98程序的声音调试记录

    最近在Window程序设计第五版,刚看到第三章,第三章中有一个程序调用了一个多媒体对象库winmm.lib库,由于该库不再默认项目中,如果不手动添加,编译时会提示错误而无法运行,但是书上用的是Visu ...

  6. 【Windows】如何判断当前鼠标是否按下左键或右键

    在delphi中,很多窗体和控件的鼠标事件里面已经将鼠标按键状态封装好传给响应事件的函数,所以这种情况直接使用就可以,但在某些时候,我们没有这些事件可以处理时,想判断鼠标按键是否按下的状态,就需要借助 ...

  7. 学习simple.data之高级篇

    一.调用存储过程 1.不带参数 CREATE PROCEDURE ProcedureWithoutParams AS SELECT * FROM ORDER; 调用db.ProcedureWithou ...

  8. ios 文件操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  9. MTK机子修复分区信息

    这是前一个星期的事了,最近一直懒得写博客~ 此事是由于我误刷了内核,然后导致分区信息出错... 内置存储挂载不上,也找不到内置存储的分区! 如果不是star的帮助.估计俺的爪机就要返厂了!! 接下来说 ...

  10. m3u8

    audo apt-get install pkg-configsudo apt-get install automake autoconf m4 libtool sudo apt-get instal ...