zoukankan      html  css  js  c++  java
  • 也发一个自己实现的android简单文件选择器代码。支持多卡,排序

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

    项目下载地址:点击下载

  • 相关阅读:
    Linux下压缩解压缩命令
    Linux挂载外部设备
    Ubuntu下安装软件的三种方式
    Linux查看和修改文件权限
    Linux命令行基础操作
    window下常用的cmd命令
    圆角进度条,带数字居中显示的圆角进度条
    上下滑动控件
    window下Jekyll+github搭建自己的博客
    PAT 团体程序设计天梯赛 L1-046 整除光棍(模拟除法)
  • 原文地址:https://www.cnblogs.com/Mr-Nobody/p/3677121.html
Copyright © 2011-2022 走看看