#GitHub地址
引用:
implementation 'com.github.ns3chz:Picker:1.0.2'
#使用姿勢
開啟選擇界面如下:
//創(chuàng)建對象
//傳遞requestCode涕侈,傳遞Activity或Fragment或androidx.fragment.app.Fragment參數
FilePicker.build(MainActivity.this, 1)
//設置初始打開的目錄,默認為sdcard
.setOpenFile(new File("sdcard/123/"))//
//設置選擇文件還是文件夾煤辨,默認為文件
.setPickFileType(FilePickerUiParams.PickType.FILE)
//設置為單選,setMultiPick為設置多選木张,不可設置多選文件夾
.setSinglePick(new FilePicker.OnSinglePickListener() {
@Override
public void pick(@NonNull File path) {
tvResult.setText("單選 : \n" + path.getAbsolutePath());
}
@Override
public void cancel() {
tvResult.setText("取消選擇了");
}
})
//打開選擇界面
.open();
另外需要在onActivityResult中添加代碼:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//會自動去集合中找到對應的組件众辨、請求碼做返回
FilePicker.onActivityResult(this, requestCode, resultCode, data);
}
pick.gif
#方法參數
setPickFileType : 設置選擇類型,多選無效(強制為FILE類型)
- PickType.FILE :選擇文件
- PickType.FOLDER : 選擇文件夾舷礼,可以新建文件夾
- PickType.FILE_OR_FOLDER : 選擇文件鹃彻。當沒有選擇文件時,返回當前文件夾
setOpenFile : 設置初始打開的目錄妻献,默認為sdcard
setSinglePick : 設置為單選
setMultiPick : 設置為多選蛛株,最后設置的單(多)選有效
另外团赁,可以自定義列表item的布局
/**
* @param layout RecyclerView#Item的布局
* @param icon 文件圖標{@link android.widget.ImageView}id
* @param name 文件名稱{@link android.widget.TextView}id
* @param desc 文件描述{@link android.widget.TextView}id
* @param select 選擇狀態(tài)View{@link android.view.View}id,
* 這里的選中狀態(tài)的變化通過{@link #setChoiceState(BaseRecyclerAdapter.ChoiceState)}控制
* @return
*/
public FilePicker setItemFileLayoutRes(@LayoutRes int layout, @IdRes int icon, @IdRes int name, @IdRes int desc, @IdRes int select)
/**
* @param file 文件圖標
* @param folder 文件夾圖標
* @return
*/
public FilePicker setItemFileDrawable(@DrawableRes int file, @DrawableRes int folder)
檢查存儲權限
//檢擦權限
boolean hasPermission = UtilPermission.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (!hasPermission) {
UtilPermission.request(this, 1, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
new UtilPermission.OnPermissionRequestListener() {
@Override
public void listen(int requestCode, @Nullable String[] requestPermissions,
@Nullable List<String> grantedPermissions, @Nullable List<String> deniedPermissions) {
if (grantedPermissions != null) {
viewDataBinding.getVmFilePicker().refreshFolder();
}
}
});
}
Adapter代碼
ViewHolder
class Holder extends RecyclerView.ViewHolder {
@Nullable
final View desc;
@Nullable
final View icon;
@Nullable
final View name;
@Nullable
final View select;
Holder(@NonNull View itemView) {
super(itemView);
desc = itemView.findViewById(uiParams.getId_picker_recycler_item_desc());
icon = itemView.findViewById(uiParams.getId_picker_recycler_item_icon());
name = itemView.findViewById(uiParams.getId_picker_recycler_item_name());
select = itemView.findViewById(uiParams.getId_picker_recycler_item_select());
}
}
onBindViewHolder
@Override
public void onBindsViewHolder(Holder holder, int position) {
File file = dataList.get(position);
//
if (holder.icon != null) {
if (holder.icon instanceof ImageView) {
((ImageView) holder.icon).setImageResource(file.isFile() ?
uiParams.getRes_drawable_type_file() : uiParams.getRes_drawable_type_folder());
} else {
holder.icon.setBackgroundResource(file.isFile() ?
uiParams.getRes_drawable_type_file() : uiParams.getRes_drawable_type_folder());
}
}
//
if (holder.name != null) {
if (holder.name instanceof TextView) {
((TextView) holder.name).setText(file.getName());
}
}
//
if (holder.desc != null) {
if (holder.desc instanceof TextView) {
if (file.isDirectory() && (FilePickerUiParams.PickType.FILE.equals(uiParams.getPickType()) ||
FilePickerUiParams.PickType.FILE_OR_FOLDER.equals(uiParams.getPickType()))) {
String[] list = file.list();
((TextView) holder.desc).setText((list == null ? 0 : list.length) + " 項");
} else {
((TextView) holder.desc).setText(null);
}
}
}
//
}
在選擇取消選擇后谨履,根據參數改變selectView的狀態(tài)
@Override
public void onBindChooseState(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull ChoiceState choiceState, boolean hadChoice) {
if (holder instanceof Holder) {
Holder vHolder = (Holder) holder;
if (vHolder.select != null) {
switch (choiceState) {
case SELECT:
setViewSelected(vHolder.select, hadChoice);
break;
case CHECKED:
setViewChecked(vHolder.select, hadChoice);
break;
case NONE:
setViewSelected(vHolder.select, false);
setViewChecked(vHolder.select, false);
break;
}
}
}
}
文件排序
@NonNull
private List<File> getSortData() {
File currentFile = uiParams.getCurrentFile();
if (!currentFile.canRead()) {
return new ArrayList<>();
}
List<File> fileList = new ArrayList<>(Arrays.asList(currentFile.listFiles()));
switch (uiParams.getPickType()) {
case FOLDER:
for (int i = fileList.size() - 1; i >= 0; i--) {
try {
File file = fileList.get(i);
if (file.isFile()) {
fileList.remove(i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
break;
case FILE:
case FILE_OR_FOLDER:
break;
}
//排序
Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
boolean f1isDir = f1.isDirectory();
boolean f2isDir = f2.isDirectory();
if (f1isDir && !f2isDir) return -1;
if (!f1isDir && f2isDir) return 1;
//以.開頭的文件放到最后
boolean conP1 = f1.getName().startsWith(".");
boolean conP2 = f2.getName().startsWith(".");
if (!conP1 && conP2) return -1;
if (conP1 && !conP2) return 1;
return f1.compareTo(f2);
}
});
return fileList;
}
選擇item的邏輯放到BaseRecyclerAdapter中了
#總結
- 缺點:
- 不能對文件進行分類選擇
- 多選情況下欢摄,不能跨文件夾進行選擇
- 不能選擇多個文件夾
- 優(yōu)點:
- 可以選擇文件夾
- 可以選擇多個文件
- 可以搜索文件
- 選擇文件夾時,可以新建文件夾
- 使用只需要兩步
謝謝
stormtroopocat.png