一个很简单的文件选择器对话框,支持双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. c++库大全

    1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各大有名库的介绍— ...

  2. 2_2数据类型与C#部分语法[wp8特色开发与编程技巧]

    2_2数据类型 -5min 类型介绍 在上个视频中我们构建了我们第一个应用.这一次我们要来了解下c#的数据类型 众所周知,在我们已认知的世界里,我们把文字分为数字与字符.在程序的世界里面我们把数据分为 ...

  3. oracle中=>是什么意思

    => 是 Oracle 中调用 存储过程的时候, 指定 参数名进行调用.一般是, 某些参数有默认值的时候,你需要跳过某些参数来进行调用.下面是具体的例子. 参数的默认值SQL> CREAT ...

  4. Delete PeopleSoft Query From the Database

    There could be different reasons why a PeopleSoft developer would like to delete a query from the da ...

  5. 【转】准确理解CSS clear:left/right的含义及实际用途

    零.说点什么 好久没更新了.并不是在折腾什么大作,而是广度学习与实践中,加上婚礼等诸多大事,所以产出较少. 今天这篇也只是小作,博客是自己很好的学习工具,只要我学习不止,博客也会不断更新的. 我们平时 ...

  6. [leetcode]_Symmetric Tree

    第二道树的题目,依旧不会做,谷歌经验. 题目解释: give you a tree , judge if it is a symmetric tree. 思路:我以为要写个中序遍历(进阶学习非递归算法 ...

  7. 错记-checkbox radio

    很多时候我想会用到浏览器默认的单选按钮或者复选框,比如说偷懒的时候或者心情不好的时候╮(╯﹏╰)╭, 在html结构里我想实现点击文字旁边的单选按钮就跟着选中或反之,像这样:

  8. linux expect初识

    写个命令,让ssh服务器便捷点 #!/usr/bin/expect set type [lindex $argv 0] if {$type == "server"} { set i ...

  9. linux下的循环命令写法

    直切正题 方法一:利用while do循环,举例,while true;do ls;sleep 1;done  解释,该命令为每秒执行ls查询命令,sleep 1 为每秒循环,其他命令可直接替换 ls ...

  10. 一个ListView中显示不同的item(分组)

    MainActivity: package com.zzw.qqgroup; import java.util.ArrayList; import java.util.HashMap; import ...