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