项目中需要用到一个简单的文件选择器,来选择SD卡里的文件,做一个简单的DEMO功能实现。
写的比较粗糙,资源图片就不上传了,屏蔽掉即可!很简单的东西没什么技术含量,以后再继续优化吧!
功能
点击文件夹进入该文件夹下的目录并列出文件
非文件夹可直接选择选取该文件
package com.yh.fireworks.ui.activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.yh.fireworks.R;
import com.yh.fireworks.base.BaseActivity;
import com.yh.fireworks.model.FileDataInfo;
import com.yh.fireworks.ui.adapter.FolderManageAdapter;
import com.yh.fireworks.utils.StringUtils;
import com.yh.fireworks.utils.ToastUtils;
import com.yh.fireworks.validate.util.StringUtil;
import com.yh.fireworks.widget.WrapContentLinearLayoutManager;
import java.io.File;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
* @enterprise
* @Author Baocheng.Zhang
* @Date 2021/6/6
* @Version 1.0
* @Description 文件夹管理器
*/
public class FolderManageActivity extends BaseActivity implements View.OnClickListener {
TextView titleNameTV;
ImageView backIV;
TextView statusBarHeightTV;
RecyclerView recyclerview;
//下拉刷新
TextView nullDataTV;
TextView selectAllTV;
TextView deleteTV;
RelativeLayout bottomRL;
private TextView catalogueTV;
private TextView returnTV;//返回上一级
private LinearLayoutManager layoutManager;
private FolderManageAdapter fileManageAdapter;
private List<FileDataInfo> fileList = new ArrayList<>();//文档列表
private String filePath = "";//当前进入的文件目录
private List<String> filePathList;//文件路径List
@Override
public int getLayoutId() {
return R.layout.activity_folder_manage;
}
@Override
public int getAppBarColor() {
return 0;
}
@Override
protected void initViewData(Bundle savedInstanceState) {
deleteTV = (TextView) this.findViewById(R.id.delete_tv);
deleteTV.setOnClickListener(this);
selectAllTV = (TextView) this.findViewById(R.id.toolbar_right_tv);
selectAllTV.setText("全选");
selectAllTV.setOnClickListener(this);
selectAllTV.setTag("");
bottomRL = (RelativeLayout) this.findViewById(R.id.bottom_rl);
nullDataTV = (TextView) this.findViewById(R.id.null_data_tv);
catalogueTV = (TextView) this.findViewById(R.id.catalogue_tv);
returnTV = (TextView) this.findViewById(R.id.return_tv);
returnTV.setOnClickListener(this);
recyclerview = (RecyclerView) this.findViewById(R.id.recyclerview);
titleNameTV = (TextView) this.findViewById(R.id.title_name_tv);
backIV = (ImageView) this.findViewById(R.id.back_iv);
statusBarHeightTV = (TextView) this.findViewById(R.id.status_bar_height_tv);
titleNameTV.setText("文件管理");
statusBarHeightTV.setVisibility(View.VISIBLE);
statusBarHeightTV.setHeight(getStatusBarHeight());
backIV.setVisibility(View.VISIBLE);
backIV.setOnClickListener(this);
filePathList = new ArrayList<>();
//搜的是根目录
File rootSdkFile = Environment.getExternalStorageDirectory();
filePathList.add(rootSdkFile.getPath());//把根目录加进去
//list 布局
initRecycler();
//获取数据
getData();
}
private void initRecycler() {
//初始化布局控件
layoutManager = new WrapContentLinearLayoutManager(mActivity, LinearLayoutManager.VERTICAL, false);
recyclerview.setLayoutManager(layoutManager);
fileManageAdapter = new FolderManageAdapter(mActivity, fileList);
fileManageAdapter.setOnClickLinster(new FolderManageAdapter.onClickLinster() {
@Override
public void itemClick(View view, int position, List<FileDataInfo> adapterList) {
switch (view.getId()) {
case R.id.right_cb_rl:
case R.id.ck_iv:
//显示全选
//selectAllTV.setVisibility(View.VISIBLE);
//多选
if (adapterList.get(position).isSelect()) {
fileList.get(position).setSelect(false);
} else {
fileList.get(position).setSelect(true);
}
int count = 0;
for (int i = 0; i < fileList.size(); i++) {
if (fileList.get(i).isSelect()) {
count = count + 1;
break;
}
}
if (count > 0) {
bottomRL.setVisibility(View.VISIBLE);
} else {
bottomRL.setVisibility(View.GONE);
}
fileManageAdapter.notifyDataSetChanged();
break;
case R.id.file_content_ll:
//如果是文件则进行预览
//如果是文件夹则进入到文件夹目录下
FileDataInfo fileDataInfo = fileList.get(position);
if (fileDataInfo.isFolder()) {
//文件夹 进入到该文件夹下
filePath = fileDataInfo.getFilePath();
filePathList.add(filePath);//把路径放进去
getData();
} else {
//文件 点击后预览
if ("word".equals(fileDataInfo.getFileType()) ||
"pdf".equals(fileDataInfo.getFileType()) ||
"ppt".equals(fileDataInfo.getFileType()) ||
"excel".equals(fileDataInfo.getFileType())) {
String filePath = fileList.get(position).getFilePath();
String fileName = fileList.get(position).getFileName();
Intent intent = new Intent(mActivity, TbsReadActivity.class);
intent.putExtra("filePath", filePath);
intent.putExtra("fileName", fileName);
startActivity(intent);
} else if ("mp4".equals(fileDataInfo.getFileType())) {
Intent intent = new Intent(mActivity, VideoPreviewActivity.class);
intent.putExtra("videoType", "1");
intent.putExtra("videoUrl", "file:///" + fileDataInfo.getFilePath() + "/" + fileDataInfo.getFileName() + "");
intent.putExtra("startPlay", "true");
startActivity(intent);
} else if ("png".equals(fileDataInfo.getFileType())) {
List<String> imgList = new ArrayList<String>();
imgList.add("file:///" + fileDataInfo.getFilePath() + "/" + fileDataInfo.getFileName());
Intent intent = new Intent(mActivity, ImgPreviewActivity.class);
intent.putExtra("imglist", (Serializable) imgList);
intent.putExtra("position", 0);
startActivity(intent);
} else {
ToastUtils.showToast(mContext, "暂不支持此类型文件预览");
}
}
break;
default:
break;
}
}
});
recyclerview.setAdapter(fileManageAdapter);
}
/**
* 加载数据
*/
private void getData() {
fileList.clear();
//获取文件
getSDKFiles();
if (fileList.size() == 0) {
nullDataTV.setVisibility(View.VISIBLE);
recyclerview.setVisibility(View.GONE);
fileManageAdapter.notifyDataSetChanged();
} else if (fileList != null && fileList.size() > 0) {
nullDataTV.setVisibility(View.GONE);
recyclerview.setVisibility(View.VISIBLE);
fileManageAdapter.notifyDataSetChanged();
}
}
/**
* 获取SDK路径
*/
private void getSDKFiles() {
fileList.clear();
File sdkFile;
File[] sdkFileList;
if (StringUtil.isEmpty(filePath)) {
//搜的是根目录
sdkFile = Environment.getExternalStorageDirectory();
sdkFileList = sdkFile.listFiles();
catalogueTV.setText(sdkFile.getPath());
} else {
sdkFile = new File(filePath);
sdkFileList = sdkFile.listFiles();
catalogueTV.setText(filePath);
}
if (sdkFileList == null) {
return;
}
FileDataInfo fileInfo;
for (int i = 0; i < sdkFileList.length; i++) {
Log.i("文件名", sdkFileList[i].getName() + "");
String fileName = sdkFileList[i].getName() + "";
if (!StringUtils.isEmpty(fileName)) {
fileInfo = new FileDataInfo();
//设置文名
fileInfo.setFileName(fileName);
//设置文件路径
fileInfo.setFilePath((sdkFileList[i].getPath()));
//设置文件大小
//fileInfo.setFileSize(FileSizeUtil.getAutoFileOrFilesSize(fileInfo.getFilePath() + "/" + fileName));
//设置文件创建实践
fileInfo.setFileTime(getFileLastModifiedTime(new File(sdkFileList[i].getPath())));
//判断是否是文件夹
File file = new File(sdkFileList[i].getPath());
if (file.exists()) {
fileInfo.setFolder(file.isDirectory());
} else {
fileInfo.setFolder(false);
}
if (!fileInfo.isFolder()) {
//不是文件夹 筛选word ex ppt xls jpg mp4 等文件
String[] nameSplit = fileName.split("\\.");
Log.i("showFileNumber", nameSplit.length + "");
if (nameSplit.length >= 2) {
//fileInfo.setFile(file);
fileInfo.setSuffix(nameSplit[1]);
//根据后缀类型筛选
if ("doc".equals(nameSplit[nameSplit.length - 1]) || "docx".equals(nameSplit[nameSplit.length - 1])) {
fileInfo.setFileType("word");
} else if ("ppt".equals(nameSplit[nameSplit.length - 1])) {
fileInfo.setFileType("ppt");
} else if ("xls".equals(nameSplit[nameSplit.length - 1]) || "xlsx".equals(nameSplit[nameSplit.length - 1])) {
fileInfo.setFileType("excel");
} else if ("pdf".equals(nameSplit[nameSplit.length - 1])) {
fileInfo.setFileType("pdf");
} else if ("jpg".equals(nameSplit[nameSplit.length - 1]) || "png".equals(nameSplit[nameSplit.length - 1])) {
fileInfo.setFileType("png");
} else if ("mp4".equals(nameSplit[nameSplit.length - 1])) {
fileInfo.setFileType("mp4");
} else if ("zip".equals(nameSplit[nameSplit.length - 1]) || "rar".equals(nameSplit[nameSplit.length - 1])) {
fileInfo.setFileType("zip");
} else {
fileInfo.setFileType("other");
}
fileList.add(fileInfo);
}
} else {
//是文件夹
fileList.add(fileInfo);
}
}
}
Log.i("文件总数", fileList.size() + "");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back_iv:
finish();
break;
case R.id.return_tv:
if (filePathList.size() >= 2) {
String dqFilePath = filePathList.get(filePathList.size() - 1);//当前目录
String lastFilePath = filePathList.get(filePathList.size() - 1 - 1);//上一个目录
Log.i("文件", "当前目录" + dqFilePath);
Log.i("文件", "上一个文件目录" + lastFilePath);
filePath = lastFilePath;
getData();
//把最后一个删除
filePathList.remove(filePathList.size() - 1);
}
break;
case R.id.toolbar_right_tv:
//全选
if (StringUtils.isEmpty((String) selectAllTV.getTag())) {
//先前没有点 点击是全选
for (int i = 0; i < fileList.size(); i++) {
fileList.get(i).setSelect(true);
}
selectAllTV.setTag("all");
} else {
if ("all".equals(selectAllTV.getTag())) {
//取消
for (int i = 0; i < fileList.size(); i++) {
fileList.get(i).setSelect(false);
}
fileManageAdapter.notifyDataSetChanged();
selectAllTV.setTag("delete");
selectAllTV.setText("取消");
} else if ("delete".equals(selectAllTV.getTag())) {
//添加
for (int i = 0; i < fileList.size(); i++) {
fileList.get(i).setSelect(true);
}
fileManageAdapter.notifyDataSetChanged();
selectAllTV.setTag("all");
selectAllTV.setText("全选");
}
}
break;
default:
break;
}
}
private static final String mformatType = "yyyy-MM-dd HH:mm:ss";
public static String getFileLastModifiedTime(File file) {
Calendar cal = Calendar.getInstance();
long time = file.lastModified();
SimpleDateFormat formatter = new SimpleDateFormat(mformatType);
cal.setTimeInMillis(time);
// 输出:修改时间[2] 2009-08-17 10:32:38
return formatter.format(cal.getTime());
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/app_activity_bg_color"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/top_tb"
layout="@layout/toolbar_activity" />
<LinearLayout
android:id="@+id/action_ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/top_tb"
android:orientation="vertical">
<TextView
android:id="@+id/catalogue_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="根目录" />
<TextView
android:id="@+id/return_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="返回上一层" />
</LinearLayout>
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/rf_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/action_ll">
<com.scwang.smartrefresh.layout.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srlDrawableArrow="@drawable/arrow_up" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone" />
<TextView
android:id="@+id/null_data_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:drawableTop="@drawable/bg_null_data"
android:drawablePadding="10dp"
android:gravity="center"
android:text="暂无文件"
android:textColor="#999999"
android:textSize="12sp"
android:visibility="gone" />
</RelativeLayout>
<com.scwang.smartrefresh.layout.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
<RelativeLayout
android:id="@+id/bottom_rl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/rf_layout"
android:layout_alignParentBottom="true"
android:background="#ff0c7afc"
android:padding="10dp"
android:visibility="gone">
<TextView
android:id="@+id/delete_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginStart="15dp"
android:layout_marginLeft="15dp"
android:layout_marginEnd="15dp"
android:layout_marginRight="15dp"
android:drawableTop="@drawable/icon_file_delete"
android:gravity="center_horizontal|center_vertical"
android:padding="10dp"
android:text="发送"
android:textColor="@color/white"
android:textSize="12sp" />
</RelativeLayout>
</RelativeLayout>
</FrameLayout>
public class FolderManageAdapter extends RecyclerView.Adapter<FolderManageAdapter.ViewHolder> {
private Context context;
private List<FileDataInfo> list;
public FolderManageAdapter(Context context, List<FileDataInfo> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_folder_manage, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
FileDataInfo fileInfo = list.get(position);
if(fileInfo.isFolder()){
//文件夹
holder.logoIV.setImageResource(R.drawable.file_manage_wj);
holder.ckIV.setVisibility(View.INVISIBLE);//隐藏选中
}else{
//文件放开选中
holder.ckIV.setVisibility(View.VISIBLE);
if ("word".endsWith(fileInfo.getFileType())) {
holder.logoIV.setImageResource(R.drawable.icon_file_word);
} else if ("pdf".endsWith(fileInfo.getFileType())) {
holder.logoIV.setImageResource(R.drawable.icon_file_pdf);
} else if ("ppt".endsWith(fileInfo.getFileType())) {
holder.logoIV.setImageResource(R.drawable.icon_file_ppt);
} else if ("excel".endsWith(fileInfo.getFileType())) {
holder.logoIV.setImageResource(R.drawable.icon_file_excel);
} else if ("zip".equals(fileInfo.getFileType())) {
holder.logoIV.setImageResource(R.drawable.icon_file_ysb);
} else if ("png".equals(fileInfo.getFileType())) {
//获取本地图片展示
Glide.with(context).load(fileInfo.getFilePath() + "/" + fileInfo.getFileName())
.apply(new RequestOptions()
.transforms(new CenterCrop(), new RoundedCorners(10)
))
.into(holder.logoIV);
} else if ("mp4".equals(fileInfo.getFileType())) {
//获取mp4第一帧展示
Glide.with(context).load(fileInfo.getFilePath() + "/" + fileInfo.getFileName())
.apply(new RequestOptions()
.transforms(new CenterCrop(), new RoundedCorners(10)
))
.into(holder.logoIV);
} else {
holder.logoIV.setImageResource(R.drawable.icon_file_qt);
}
}
ViewGroup.LayoutParams lp = holder.ckIV.getLayoutParams();
if (list.get(position).isSelect()) {
holder.ckIV.setBackground(context.getDrawable(R.drawable.icon_file_ok));
int max = DensityUtil.dp2px(context, 24);
lp.width = max;
lp.height = max;
} else {
int mini = DensityUtil.dp2px(context, 14);
holder.ckIV.setBackground(context.getDrawable(R.drawable.icon_file_no));
lp.width = mini;
lp.height = mini;
}
holder.ckIV.setLayoutParams(lp);
holder.titleTV.setText(list.get(position).getFileName() + "");
holder.timeTV.setText(list.get(position).getFileTime() + "");
holder.sizeTV.setText(list.get(position).getFileSize() + "");
holder.ckIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
linster.itemClick(view, position, list);
}
});
holder.rightCbRL.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
linster.itemClick(v, position, list);
}
});
holder.fileContentLL.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
linster.itemClick(v, position, list);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private final LinearLayout fileContentLL;
private final TextView titleTV;
private final TextView timeTV;
private final TextView sizeTV;
private final ImageView logoIV;
private final ImageView ckIV;
private final RelativeLayout rightCbRL;
public ViewHolder(@NonNull View itemView) {
super(itemView);
fileContentLL = ((LinearLayout) itemView.findViewById(R.id.file_content_ll));
titleTV = ((TextView) itemView.findViewById(R.id.title_tv));
timeTV = ((TextView) itemView.findViewById(R.id.time_tv));
sizeTV = ((TextView) itemView.findViewById(R.id.size_tv));
logoIV = ((ImageView) itemView.findViewById(R.id.logo_iv));
ckIV = ((ImageView) itemView.findViewById(R.id.ck_iv));
rightCbRL = ((RelativeLayout) itemView.findViewById(R.id.right_cb_rl));
}
}
onClickLinster linster;
public void setOnClickLinster(onClickLinster linster) {
this.linster = linster;
}
public interface onClickLinster {
void itemClick(View view, int position, List<FileDataInfo> titles);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipeMenuLayout_sm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/logo_iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp" />
<LinearLayout
android:id="@+id/file_content_ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/right_cb_rl"
android:layout_toRightOf="@+id/logo_iv"
android:orientation="vertical"
android:padding="10dp"
android:layout_toStartOf="@+id/right_cb_rl"
android:layout_toEndOf="@+id/logo_iv">
<TextView
android:id="@+id/title_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="#333333"
android:textSize="16sp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">
<TextView
android:id="@+id/time_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:textColor="#999999"
android:textSize="14sp"
android:layout_alignParentStart="true" />
<TextView
android:id="@+id/size_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/time_tv"
android:textColor="#999999"
android:textSize="14sp"
android:layout_toEndOf="@+id/time_tv"
android:layout_marginStart="10dp" />
</RelativeLayout>
</LinearLayout>
<RelativeLayout
android:id="@+id/right_cb_rl"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true">
<ImageView
android:id="@+id/ck_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@drawable/icon_file_no"
android:padding="10dp" />
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
真诚点赞 诚不我欺~