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

2014-10-14  来源:本站原创  分类:工作日志  人气:1 

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

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

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

代码如下:

  1 package net.yunstudio.demo;
  2
  3 import java.io.File;
  4 import java.text.Collator;
  5 import java.util.ArrayList;
  6 import java.util.Collections;
  7 import java.util.Comparator;
  8 import java.util.HashMap;
  9 import java.util.List;
 10 import java.util.Locale;
 11 import java.util.Map;
 12
 13
 14 import android.app.Dialog;
 15 import android.content.Context;
 16 import android.os.Environment;
 17 import android.text.TextUtils;
 18 import android.util.Log;
 19 import android.view.View;
 20 import android.widget.AdapterView;
 21 import android.widget.AdapterView.OnItemClickListener;
 22 import android.widget.ListView;
 23 import android.widget.SimpleAdapter;
 24
 25 public class FilePickerDialog extends Dialog implements OnItemClickListener{
 26
 27     public FilePickerDialog(Context context) {
 28         super(context);
 29         init();
 30     }
 31
 32
 33     private ListView lv_file;
 34     private SimpleAdapter simpleAdapter;
 35     private List<Map<String, Object>> dataList;
 36     private OnFileSelectListener listener;
 37     //通过获取sd卡的父级,可以兼容双sd卡的情况
 38     private static final File rootPath=
 39             Environment.getExternalStorageDirectory().getParentFile();
 40
 41     private static final String SRC="src";
 42     private static final String NAME="name";
 43     private static final String FILE="file";
 44     private static final String IS_BAK="isBak";
 45
 46     private void init() {
 47         getChildren2dataList(rootPath);
 48         simpleAdapter=new SimpleAdapter(getContext(),dataList , R.layout.list_item_choosefile,
 49                 new String[]{SRC,NAME}, new int[]{R.id.iv_file_type,R.id.tv_file_name});
 50
 51         lv_file=new ListView(getContext());
 52         lv_file.setAdapter(simpleAdapter);
 53         lv_file.setOnItemClickListener(this);
 54         setContentView(lv_file);
 55
 56         setCanceledOnTouchOutside(true);
 57         this.setTitle("请选择文件");
 58     }
 59     /**
 60      * 设置选择文件的监听器
 61      * @param listener
 62      */
 63     public void setOnFileSelectListener(OnFileSelectListener listener) {
 64         this.listener = listener;
 65     }
 66     /**
 67      * 将本目录的子文件的信息赋值给dataList字段
 68      * @param dir
 69      */
 70     private void getChildren2dataList(File dir) {
 71         File[] children=dir.listFiles();
 72         if(dataList==null){
 73             dataList=new ArrayList<Map<String,Object>>();
 74         }else {
 75             dataList.clear();
 76         }
 77
 78         if(!rootPath.equals(dir)){
 79             Map<String, Object> map=new HashMap<String, Object>();
 80             map.put(SRC, R.drawable.folder);
 81             map.put(NAME, "..");
 82             map.put(FILE, dir.getParentFile());
 83             map.put(IS_BAK, true);
 84             dataList.add(map);
 85         }
 86         if(children==null) return ;//避免空目录引起的空指针错误
 87         for (File file : children) {
 88             Map<String, Object> map=new HashMap<String, Object>();
 89             map.put(SRC, file.isDirectory()
 90                                 ?R.drawable.folder
 91                                 :R.drawable.file);
 92             map.put(NAME, file.getName());
 93             map.put(FILE, file);
 94             dataList.add(map);
 95         }
 96
 97
 98         Collections.sort(dataList, new Comparator<Map<String, Object>>() {
 99
100             @Override
101             public int compare(Map<String, Object> lhs, Map<String, Object> rhs) {
102                 int result=0;
103
104                 if(lhs.get(IS_BAK)!=null){
105                     result = -1;
106                 }else if (rhs.get(IS_BAK)!=null) {
107                     result = 1;
108                 }else {
109                     File lhsFile=(File) lhs.get(FILE);
110                     File rhsFile=(File) rhs.get(FILE);
111
112                     if(lhsFile.isDirectory()&&rhsFile.isFile()){
113                         result = -1;
114                     }else if (lhsFile.isFile()&&rhsFile.isDirectory()) {
115                         result = 1;
116                     }else {
117                         Collator cmp = Collator.getInstance(Locale.getDefault());
118                         result = cmp.compare(lhs.get(NAME), rhs.get(NAME));
119                     }
120                 }
121                 return result;
122             }
123         });
124     }
125
126     @Override
127     public void onItemClick(AdapterView<?> parent, View view, int position,
128             long id) {
129         File file=(File)dataList.get(position).get(FILE);
130         if(file.isDirectory()){
131             getChildren2dataList(file);
132             simpleAdapter.notifyDataSetChanged();
133         }else {
134             if(listener!=null){
135                 listener.onFileSelect(file);
136                 this.dismiss();
137             }
138         }
139     }
140
141     public static interface OnFileSelectListener{
142         void onFileSelect(File file);
143     }
144 }

View Code

项目下载地址:点击下载

相关文章
  • 也发一个自己实现的android简单文件选择器代码.支持多卡,排序 2014-10-14

    一个很简单的文件选择器对话框,支持双sd卡,当然前提是要有sd卡..并且实现了排序效果. 只有100多行的代码,基本的思路就是用listview显示目录下的所有子文件,再判断是文件还是目录. 利用Collections.sort方法进行排序. 代码如下: 1 package net.yunstudio.demo; 2 3 import java.io.File; 4 import java.text.Collator; 5 import java.util.ArrayList; 6 import

  • Android Zip文件解压缩代码 2012-09-28

    在Android平台中如何实现Zip文件的解压缩功能呢? 因为Android内部已经集成了zlib库,对于英文和非密码的Zip文件解压缩还是比较简单的,下面给大家一个解压缩zip的 java代码,可以在Android上任何版本中使用,Unzip这个静态方法比较简单,参数一为源zip文件的完整路径,参数二为解压缩后存放的文件夹. 01 private static void Unzip(String zipFile, String targetDir) { 02 int BUFFER = 4096

  • 发一个php简单的伪原创程序,配合商城采集用的 2013-12-28

    在网上搜了一个伪原创的程序,下下来,结果太令人惊奇的.以前也在为如何将一段文字里的某些词替换掉而苦恼,原来php有个strtr函数. <?php $arr=array(); $arr['好']='坏'; $arr['不好']='不坏'; $arr['坏']='好'; $arr['不坏']='不好'; $str="我们好不好"; echo strtr($str,$arr); //输出我们坏不坏 ?> 于是问题就很好解决了.自己构建了一个数据库来收集同义词 关键的两个程序是导入

  • android 简单图片动画播放的实例代码 2013-10-14

    android 简单图片动画播放的实例代码,需要的朋友可以参考一下 xml中: <ImageView android:id="@+id/touchview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerV

  • 做一个懒惰高效的Android程序员(3) 2013-10-08

    欢迎来到"做一个懒惰但富有成效的Android开发者"系列的第3部分.如果你在JSON解析上是一个懒惰的Android开发者但又想通过使用JSON解析类库变得高效,那么本文就是为你准备的. 本系列至今: 第1部分:我们看了RoboGuice,一个依赖注入类库,使用它我们可以减少基本样板代码,节省时间,从而在Android开发中提高生产力. 第2部分:我们查看并探讨了Genymotion,与原生仿真器相比,是一个火箭速度.超快速的仿真器.在开发应用的时候我们可以使用Genymotion,

  • 做一个懒惰高效的Android程序员(2) 2015-03-29

    在前一篇文章中,我们讨论了关于依赖注入和RoboGuice库.今天我们要讲的是一款很棒的测试和开发工具. 我从Android源码1.5开始做开发一直到现在,经历了Android和Android模拟器的发展过程.我觉得速度是提高了一些,但是没有我们想象中的那么流畅和好用,我相信很多Android开发者都厌倦了打开本地模拟器,然后进入加载界面,然后各种无响应和卡顿.虽然通过快照(snapshot)可以加速. 补充一下,因为我也做Windows程序开发,我发现Windows phone的模拟器很快,表

  • 分享一个PHP数据流应用的简单例子 2014-04-24

    分享一个PHP数据流应用的简单例子,需要的朋友可以参考下 <?php $count = 5; start: if($count < 5) echo "You can try {$count} time, "; echo "Put Password: "; $handle = fopen ("php://stdin","r"); $line = fgets($handle); if(trim($line) != '1

  • android webview 简单浏览器实现代码 2014-07-26

    android webview 简单浏览器实现代码,需要的朋友可以参考一下 文件main.java package com.HHBrowser.android; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.webkit.WebView; impor

  • c# dataTable 合并两个列到一个新列中的简单实例 2014-09-09

    这篇文章介绍了c# dataTable 合并两个列到一个新列中的简单实例,有需要的朋友可以参考一下 public static DataTable UniteDataTableColumns(DataTable dt, String newColumnName, string ColumnName1, string ColumnName2) { //汇总的表达式 string expression = ""; expression = String.Format("{0}+'

  • PHP 一个比较完善的简单文件上传 2014-12-04

    PHP 一个比较完善的简单文件上传 转点别人的代码,留着自己用! <HTML> <HEAD> <TITLE>文件上传</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"></HEAD> <BODY> <? $UploadedFile=$_FILES['UploadedFile']

  • 一个iOS开发者学习Android之路 2015-01-24

    "朝向黑暗的一面!" 最近我参加了一次Big Nerd Ranch在Banning Mills的Android训练营,这件事在Twitter上引发了一片错愕,因为我一直被认为是一个Objective C和Cocoa的脑残粉,事实上我就是Big Nerd Ranch iOS训练营的老师 . 参加Android训练营的事曝光后让我掉了好几个粉丝.这是我整个人气下滑故事的开始. 在Facebook的一段往事- 差不多一年前,当时我在Menlo Park的Facebook总部教iOS 训练营的

  • 发一个比较漂亮的选项卡动态增删的效果 2014-04-14

    先放个图片,我改下代码. 163邮箱选项卡效果 1.代码效果示例: Kiss Andy 注:以上代码为DOM动态组织的代码参考 2.点击下表,更换内容 蓝色理想 Google中国 Email-126 艾泽拉斯 3.以下为动态创建: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 代码说明 1.我的CSS分割为2段了,第一段为此演视用,可自己定制,第二段为此框架必须. 2.script我也分割为2段,第一段为必须,第二段为客户定制的,我这里的代码是给一个实现参考. 3.以下的HTML代

  • android实现蓝牙文件发送的实例代码,支持多种机型 2014-01-28

    这篇文章主要介绍了android实现蓝牙文件发送的实例代码,有需要的朋友可以参考一下 最近项目上需要实现蓝牙传输apk的一个功能,能够搜索周围的蓝牙手机并分享文件.从需求上讲android手机自带的蓝牙传输模块就可以满足需要了,实现也很简单.不过让人头疼的是,虽然说一般的主流机型都配置有蓝牙模块,但是android机型碎片化太严重,不同android版本手机蓝牙功能也不一样.4.0.3以下版本和以上版本使用的蓝牙包是不同的,分别是"com.android.bluetooth"和&quo

  • 解析Android资源文件及他们的读取方法详解 2013-10-18

    本篇文章是对Android资源文件及他们的读取方法进行了详细的分析介绍,需要的朋友参考下 Sam在Android开发中,有两种处理资源文件的方式.其一,是将所有资源文件以及JNI程序放置于一个单独的资源包.使用到他们时,使用文件方式读取.或者直接使用C++层代码读取. 其二,则是将资源文件加入到APK内部.使用各种不同的办法去得到其内容. 方法一:适合于移植较大的C++程序时使用,因为C++代码数量众多,不太可能修改为JAVA代码.所以将其与资源文件以一定方式存放,并让他们自称体系是个好办法.但

  • 如何给你的Android 安装文件(APK)瘦身 2014-01-17

    Android的apk文件越来越大了这已经是一个不争的事实.在Android 还是最初版本的时候,一个app的apk文件大小也还只有2 MB左右,到了现在,一个app的apk文件大小已经升级到10MB到20MB这个范围了.apk文件大小的爆炸式增长主要是因为用户对app质量的期待越来越高以及开发者的开发经验增长,具体体现在以下几个方面: Android设备dpi的多样化 ([l|m|tv|h|x|xx|xxx]dpi) Android平台的进化,开发工具的改进以及开源类库生态系统的丰富 用户对高

  • 远程执行Android设备上的代码 2014-02-08

    "你走进一个咖啡店坐下来.等咖啡的时候,你拿出你的智能手机开始玩一款你前些天下载的游戏.接着,你继续工作并且在电梯里收邮件.在你不知情下,有攻击者获取了公司网络的地址并且不断地感染你所有同事的智能手机. 等下, 什么? 我们在Bromium实验室博客上不会谈论Android太多.但是不时地我们喜欢修修补补.近来,我的同事Thomas Coudray 和我探索了下Android远程代码执行的易损性,想弄明白易损性在现实应用中是多大的问题. 尽管权限提升技术在Android上很普遍(并形成了&quo

  • C++.python和go语言实现的简单客户端服务器代码示例 2014-03-17

    这篇文章主要介绍了C++.python和go语言实现的简单客户端服务器代码示例,本文分别给出了3种语言的客户端服务器通信代码实例,需要的朋友可以参考下 工作中用到了C/S模型,所做的也无非是给服务器发数据,但开发阶段会遇到程序自身的回环测试,需要用到简单的服务端以便验证数据发送的正确性. 写软件用C++,跑测试用python,这段时间也刚好看go语言,所以都要有demo.以下三组程序实现的功能相同,这里一起做下总结. 一.C++实现 Boost.Asio是一个跨平台的C++库,它用现代C++方法

  • android panellistview 圆角实现代码 2014-04-08

    android panellistview 圆角是每一个android开发者都具备的一项,对于新手朋友来说可能有点难度,接下来将详细介绍,需要了解的朋友可以参考下 (效果如上图所示) 其实很简单: 比方说上面的容器是一个ListView <ListView android:id="@+id/listView_devices" android:layout_width="fill_parent" android:layout_height="fill_

  • Android放大镜的实现代码 2015-01-18

    这篇文章主要介绍了Android放大镜的实现代码,有需要的朋友可以参考一下 快三个月了没写博客了,因为工作调动,很多经验.心得都没有时间记录下来.现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上.进入正题. 去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现.文章很乱,没有格式,基本上属于看不下去的那种.虽然体裁很有意思,但是我也没有足够的内力把它看完.不过看到一句关键的话,说是使用带圆形的Drawable.这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始

  • Android玩乐系列:修改汇编代码支持原生高清来电大头贴(三) 2015-04-30

    (接下来进一步细化上一篇的修改,前六节请参见:< Android玩乐系列:修改汇编代码支持原生高清来电大头贴(二)>) 7.一些遗留问题的修改 ======= 上面是最简版本,只是为了突出核心功能的实现,但实际留下的问题还是不少的.下面一一道来. 1) 呀.是成功了呢,不过一会儿就被改回来了. --------- [修改, 2012.09.04.方法名写错的,应该是updateInCallBackground(),而不是updateScreen()] 这并不是普遍性的问题,有些拔号面板是有背景