也发一个自己实现的android简单文件选择器代码。支持多卡,排序
一个很简单的文件选择器对话框,支持双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简单文件选择器代码。支持多卡,排序的更多相关文章
- Android简单文件浏览器源代码 (转)
Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ...
- Android第三方文件选择器:aFileChooser
Android第三方文件选择器:aFileChooser aFileChooser是Android平台上的一个第三方文件选择器,其在github上的项目主页是:https://github.co ...
- Android Zip文件解压缩代码
2011-04-01 17:58:52| 分类: Android |举报 |字号 订阅 在Android平台中如何实现Zip文件的解压 缩功能呢? 因为Android内部已经集成了zlib库,对 ...
- android 简单文件操作
1.布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...
- Android NDK开发之Android.mk文件
Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南 Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...
- Android.mk文件语法规范及使用模板
Android.mk文件语法详述 介绍:------------这篇文档是用来描述你的C或C++源文件中Android.mk编译文件的语法的,为了理解她们我们需要您先看完docs/OVERVIEW.h ...
- Android 简单计算器源码....
PS:今天算是闲着没事做了一个小型的计算器...顺便熟悉一下Android的布局,组件,以及时间监听的方法...就当是做了一个小小的练习吧... 顺便去对比了一下别人写的代码...有的使用到了 ...
- webview之如何设计一个优雅健壮的Android WebView?(下)(转)
转载:https://iluhcm.com/2018/02/27/design-an-elegant-and-powerful-android-webview-part-two/ (这篇文章写得有点晚 ...
- 如何设计一个优雅健壮的Android WebView?(下)
转:如何设计一个优雅健壮的Android WebView?(下) 前言 在上文<如何设计一个优雅健壮的Android WebView?(上)>中,笔者分析了国内WebView的现状,以及在 ...
随机推荐
- 关于tableView的优化
现在市场上的iOS应用程序界面中使用最多的UI控件是什么? 答案肯定是UITableView,几乎每一款App都有很多的界面是由UITableView实现的,所以为了做出一款优秀的App,让用户有更好 ...
- puppet实现主从部署各种软件实战参考模型
puppet实现主从部署各种软件实战参考模型 实验要求: 1.我将准备三个节点 node2 , node3 , node4 2.我们想让节点node3部署ntp,nginx ;节点node ...
- crontab的使用说明
网上瞎转载的,仅供参考 名称 : crontab 使用权限 : 所有使用者 使用方式 : crontab file [-u user]-用指定的文件替代目前的crontab. crontab-[-u ...
- Discuz X3.2 分区 gid 完美伪静态方法 Apache/Nginx
Discuz 官方给出的伪静态规则并不完整,只实现了部分的伪静态设置及规则,分区 gid 仍然是 forum.php?gid=xxx 的形式,对于有强迫症的我是无法忍受的,下面给出分区 gid 的伪静 ...
- ERROR 1045 (28000): Access denied for user root@localhost (using password:
错误描述: Mysql中添加用户之后可能出现登录时提示ERROR 1045 (28000): Access denied for user的错误.删除user.user中值为NULL的,或更新NULL ...
- mysql 修改字段长度
mysql 修改字段长度 alter table news modify column title varchar(130); alter table 表名 modify column 字段名 类型 ...
- EF 只更新部分字段
/// 只更新storedAddress数据中的DefaultAddress字段,更新为false /// 将默认地址改为不是默认地址 /// </summary> /// <par ...
- 使用WIF实现单点登录Part IV —— 常见问题
InvalidOperationException: ID1073: 尝试使用 ProtectedData API 解密 Cookie 时出现 CryptographicException (有关详细 ...
- Python核心编程--学习笔记--5--数字
本章的主题是Python中的数字,这里详细介绍每一种数字类型,它们适用的各种运算符,以及用于处理数字的内建函数.在本章的末尾简单介绍了几个标准库中用于处理数字的模块. 1 数字类型 数字:标量贮存,可 ...
- ubuntu miss tool bar
reson: unity exception 1. open terminal: /usr/bin/**terminal** 2. run command on terminal: gsetting ...