打开一个选择文件的对话框

有时我们需要在程序中选择一个文件,如果应用对文件管理要求不高的话,再写一个文件类过于繁琐。因此可以试试这个对话框,可以直接调用进行文件选择。

java文件 FilePickerDialog.java




import android.content.Context;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
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;

import com.jqorz.aiBox.R;

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;

public class FilePickerDialog extends AlertDialog implements OnItemClickListener {

    private static final File rootPath = Environment.getExternalStorageDirectory();
    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 ListView lv_file;
    private SimpleAdapter simpleAdapter;
    private List<Map<String, Object>> dataList;
    private OnFileSelectListener listener;

    public FilePickerDialog(Context context) {
        super(context);
        init();
    }

    private void init() {
        getChildren2dataList(rootPath);
        simpleAdapter = new SimpleAdapter(getContext(), dataList, R.layout.list_item_choosefile,
                new String[]{SRC, NAME}, new int[]{R.id.iv_fileType, R.id.tv_fileName});

        lv_file = new ListView(getContext());
        lv_file.setAdapter(simpleAdapter);
        lv_file.setOnItemClickListener(this);
        setView(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<>();
        } else {
            dataList.clear();
        }

        if (!rootPath.equals(dir)) {
            Map<String, Object> map = new HashMap<>();
            map.put(SRC, R.drawable.file_type_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<>();
            map.put(SRC, file.isDirectory()
                    ? R.drawable.file_type_folder
                    : R.drawable.file_type_unknown);
            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;

                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) {
        Log.i("aaaa", "aa");
        File file = (File) dataList.get(position).get(FILE);
        if (file.isDirectory()) {
            Log.i("aaaa", "isDirectory");
            getChildren2dataList(file);
            simpleAdapter.notifyDataSetChanged();
        } else {
            if (listener != null) {
                listener.onFileSelect(file);
                this.dismiss();
            }
        }
    }

    public interface OnFileSelectListener {
        void onFileSelect(File file);
    }
}

对话框中列表的子布局文件 list_item_choosefile.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:background="?android:selectableItemBackground">

    <ImageView
        android:id="@+id/iv_fileType"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_margin="10dp" />

    <TextView
        android:id="@+id/tv_fileName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@id/iv_fileType"
        android:singleLine="true"
        android:textColor="@color/black"
        android:textSize="14sp" />

</RelativeLayout>

主界面调用

void showFilePickerDialog() {
    FilePickerDialog dialog = new FilePickerDialog(this);
    dialog.setOnFileSelectListener(new FilePickerDialog.OnFileSelectListener() {
        @Override
        public void onFileSelect(File file) {

        }
    });
    dialog.show();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值