Android 目錄瀏覽支持文件夾、文件單選或者多選

廢話沒有,先看效果

Android 目錄瀏覽支持文件夾、文件單選或者多選

第一步:創建MainActivity

<code>import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.rdsa.singleselectedfileorfolder.R;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

public Context mContext;
private Button selectFile, selectFolder, mSelectFile, mSelectFolder;
private TextView result;
private Activity activity;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mContext = this;
this.activity = this;
setContentView(R.layout.activity_main);

initView();
initData();
initEvent();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == ChooseFileOrDirActivity.RequestCode && resultCode == ChooseFileOrDirActivity.ResultCode) {
ArrayList<string> resPath = data.getStringArrayListExtra(ChooseFileOrDirActivity.ResultData);
StringBuffer sb = new StringBuffer();
for(String item : resPath) {
sb.append(item).append("\\r\\n");
}
result.setText(sb.toString());
}
}

private void initView() {

this.result = super.findViewById(R.id.result);
this.selectFile = super.findViewById(R.id.selectFile);
this.selectFolder = super.findViewById(R.id.selectFolder);
this.mSelectFile = super.findViewById(R.id.mSelectFile);
this.mSelectFolder = super.findViewById(R.id.mSelectFolder);
}

private void initData() {

}

private void initEvent() {
selectFile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(activity, ChooseFileOrDirActivity.class);
intent.putExtra(ChooseFileOrDirActivity.EnterVar, ChooseFileOrDirActivity.SingleFile);
activity.startActivityForResult(intent, ChooseFileOrDirActivity.RequestCode);
}
});

selectFolder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(activity, ChooseFileOrDirActivity.class);
intent.putExtra(ChooseFileOrDirActivity.EnterVar, ChooseFileOrDirActivity.SingleFolder);
activity.startActivityForResult(intent, ChooseFileOrDirActivity.RequestCode);
}
});

mSelectFile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(activity, ChooseFileOrDirActivity.class);
intent.putExtra(ChooseFileOrDirActivity.EnterVar, ChooseFileOrDirActivity.MultiFile);
activity.startActivityForResult(intent, ChooseFileOrDirActivity.RequestCode);
}
});

mSelectFolder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(activity, ChooseFileOrDirActivity.class);
intent.putExtra(ChooseFileOrDirActivity.EnterVar, ChooseFileOrDirActivity.MultiFolder);
activity.startActivityForResult(intent, ChooseFileOrDirActivity.RequestCode);
}
});
}
}/<string>/<code>

第二步:創建MainActivity佈局文件activity_main.xml

<code><linearlayout>    xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.rdsa.selectedfileorfolder.MainActivity">


<button> android:id="@+id/selectFolder"
android:text="文件夾選擇(單選)"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<button> android:id="@+id/selectFile"
android:text="文件選擇(單選)"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<button> android:id="@+id/mSelectFolder"
android:text="文件夾選擇(多選)"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<button> android:id="@+id/mSelectFile"
android:text="文件選擇(多選)"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<textview> android:id="@+id/result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Wait for Result" />


/<textview>/<button>/<button>/<button>/<button>/<linearlayout>/<code>

第三步:創建目錄數據存儲類FileOrDirBeans

<code>public class FileOrDirBeans {
String isFile, name, isCheckVisible, isChecked, absolutePath ;

public FileOrDirBeans(String... params) {
this.isFile = params[0];

this.name = params[1];
this.isCheckVisible = params[2];
this.isChecked = params[3];
this.absolutePath = params[4];
}

public String getIsFile() {
return isFile;
}

public void setIsFile(String isFile) {
this.isFile = isFile;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getIsCheckVisible() {
return isCheckVisible;
}

public void setIsCheckVisible(String isCheckVisible) {
this.isCheckVisible = isCheckVisible;
}

public String getIsChecked() {
return isChecked;
}

public void setIsChecked(String isChecked) {
this.isChecked = isChecked;
}

public String getAbsolutePath() {
return absolutePath;
}

public void setAbsolutePath(String absolutePath) {
this.absolutePath = absolutePath;
}
}
/<code>

第四步:創建文件瀏覽ChooseFileOrDirActivity

<code>import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.rdsa.singleselectedfileorfolder.R;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ChooseFileOrDirActivity extends Activity {
public static final String EnterVar = "EnterVar";
public static final String ResultData = "SELECTED";
public static final int RequestCode = 888;
public static final int ResultCode = 999;
public static final int SingleFile = 1000;
public static final int SingleFolder = 2000;
public static final int MultiFile = 3000;
public static final int MultiFolder = 2001;


private String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();

private static final int REQUESCODE = 5;
private static final String NEED_PERMISSION = Manifest.permission.WRITE_EXTERNAL_STORAGE;
private ListView listView4File;
private TextView noDataTip;
private Button btChose;
private List<string> data;
private ArrayList<fileordirbeans> fileOrDirList;
private FileAdapter fileAdapter;



private int enterVar;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.ly_choose_file_or_folder);

this.enterVar = this.getIntent().getIntExtra(EnterVar, SingleFile);

this.initView();
this.initData();
this.initEvent();

}

private void initData() {
this.listView4File.setEmptyView(noDataTip);

this.data = new ArrayList<>();
this.fileOrDirList = new ArrayList<>();
this.fileAdapter = new FileAdapter(this, fileOrDirList, enterVar);
this.listView4File.setAdapter(fileAdapter);

if (Build.VERSION.SDK_INT >= 23) { // 判斷系統版本是否大於6.0
if (checkSelfPermission(NEED_PERMISSION) == PackageManager.PERMISSION_GRANTED) { //檢查是否有讀寫權限
loadDataFromPath(rootPath, enterVar);//從路徑中加載數據
} else {
requestPermissions(new String[]{NEED_PERMISSION}, REQUESCODE); // 申請權限
}
} else {
loadDataFromPath(rootPath, enterVar);//系統版本小於6.0直接加載數據
}
}

private void loadDataFromPath(final String mPath, final int type) {
this.data.clear(); // data為 ListView 中要顯示的數據
this.fileOrDirList.clear();

new Thread() {
public void run() {
super.run();

data = orderByName(mPath, type == SingleFolder || type == MultiFolder);
fileOrDirList = getBeans(data, type);

runOnUiThread(new Runnable() {
@Override
public void run() {
fileAdapter.setData(data, fileOrDirList);//將數據載入適配器當中

}
});
}
}.start();
}

private ArrayList<fileordirbeans> getBeans(List<string> fileList, final int type) {
ArrayList<fileordirbeans> resultList = new ArrayList<>();
for(String fileItem : fileList) {
File file = new File(fileItem);

String isFile = String.valueOf(file.isFile());
String isCheckVisible = (file.isFile() || type == SingleFolder || type == MultiFolder) ? "true" : "false";;

FileOrDirBeans bean = new FileOrDirBeans(isFile, file.getName(), isCheckVisible, "false", fileItem);
resultList.add(bean);
}
return resultList;
}

private void initView() {
listView4File = findViewById(R.id.rvFileView);
noDataTip = findViewById(R.id.noDataTip);
}

private void initEvent() {

fileAdapter.setEvent(new FileAdapter.Event() {
@Override
public void enterNextDir(String path) {
rootPath = path;
loadDataFromPath(rootPath, enterVar);
}
});

findViewById(R.id.btChose).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putStringArrayListExtra(ResultData, fileAdapter.getSelectData());
setResult(ResultCode, intent);
finish();
}
});
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUESCODE && permissions[0].equals(NEED_PERMISSION)) {

loadDataFromPath(rootPath, enterVar);
}
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {//點擊的是返回鍵
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {//按鍵的按下事件
if (rootPath.trim().equals(Environment.getExternalStorageDirectory().getAbsolutePath())) {
return super.onKeyDown(keyCode, event);
} else {
File file = new File(rootPath);
if (!file.exists()) {
return super.onKeyDown(keyCode, event);
}
rootPath = file.getParent();
loadDataFromPath(rootPath, enterVar);
return false;
}
}
}
return super.onKeyDown(keyCode, event);
}


public static ArrayList<string> orderByName(String filePath, boolean excludeFile) {
ArrayList<string> FileNameList = new ArrayList<string>();
File file = new File(filePath);
File[] files = file.listFiles();
List fileList = Arrays.asList(files);
Collections.sort(fileList, new Comparator<file>() {
@Override
public int compare(File o1, File o2) {
if (o1.isDirectory() && o2.isFile())
return -1;
if (o1.isFile() && o2.isDirectory())
return 1;
return o1.getName().compareTo(o2.getName());
}
});
for (File itemFile : files) {
if(itemFile.getName().startsWith(".")) {
continue;
} else {
if(itemFile.isFile() && excludeFile) {
continue;
}
FileNameList.add(itemFile.getAbsolutePath()); //往集合中添加符合條件的數據

}
}
return FileNameList;
}
}
/<file>/<string>/<string>/<string>/<fileordirbeans>/<string>/<fileordirbeans>/<fileordirbeans>/<string>/<code>

第五步:創建ChooseFileOrDirActivity佈局文件ly_choose_file_or_folder.xml

<code>
<linearlayout> android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<relativelayout> android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#F9F9FA">

<textview> android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />

<button> android:id="@+id/btChose"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:background="@drawable/bg_button"
android:text="確定"
android:textColor="#458B74" />
/<button>/<textview>/<relativelayout>

<listview> android:id="@+id/rvFileView"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<textview> android:id="@+id/noDataTip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:text="沒有數據可用,返回上一層" />


/<textview>/<listview>/<linearlayout>
/<code>

第六步:創建ListView的數據容器類FileAdapter

<code>
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.rdsa.singleselectedfileorfolder.R;
import java.util.ArrayList;
import java.util.List;

public class FileAdapter extends BaseAdapter {
private Context context;
private Event event;
private ArrayList<string> selectData;
private ArrayList<fileordirbeans> fileOrDirList;
private LayoutInflater mLayoutInflater; // 將 Item 的 XML 轉換成 View
private final int enterVar;

public FileAdapter(Context context, final ArrayList<fileordirbeans> fileOrDirList, int enterVar) {
this.context = context;
this.selectData = new ArrayList<>();
this.mLayoutInflater = LayoutInflater.from(context); // context 必須是界面所在的 context

this.enterVar = enterVar;
this.fileOrDirList = fileOrDirList;
}

@Override
public int getCount() {
return this.fileOrDirList.size();
}

@Override // 數據項
public Object getItem(int position) {
return fileOrDirList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}


@Override // 顯示的內容
public View getView(final int position, View convertView, ViewGroup viewGroup) {
ViewHolder viewHolder;

if(convertView == null) {
convertView = mLayoutInflater.inflate(R.layout.filechoose_layout_fileitme, null);
viewHolder = new ViewHolder();
viewHolder.icon = convertView.findViewById(R.id.icon);
viewHolder.fileName = convertView.findViewById(R.id.fileName);
viewHolder.checkBox = convertView.findViewById(R.id.checkBox);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder)convertView.getTag();
}

final FileOrDirBeans bean = fileOrDirList.get(position);
final String absPath = bean.getAbsolutePath();

bean.setIsChecked("false"); // 初始化一個boolean值 來判斷是否被選中
for (String s : selectData) { // 遍歷選中的集合
if (s.trim().equals(absPath)) { // 如果集合中的子元素與適配其中的路徑相同
bean.setIsChecked("true"); // 判斷已被選中
break; //終止循環
}
}

viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {//設置checkBox的點擊事件
if (isChecked) {//選中狀態
if (selectData.contains(absPath)) {//如果集合中包含了該元素則直接返回
if (enterVar == ChooseFileOrDirActivity.SingleFile || enterVar == ChooseFileOrDirActivity.SingleFolder) {
selectData.clear();
selectData.add(absPath);
}
} else {//否則添加
if(enterVar == ChooseFileOrDirActivity.SingleFile || enterVar == ChooseFileOrDirActivity.SingleFolder) {
selectData.clear();
}
selectData.add(absPath);
}

} else {//未選中狀態
if (selectData.contains(absPath)) {//如果集合中包含了該元素則移除
selectData.remove(absPath);
} else {//否則 返回
return;
}
}

notifyDataSetChanged();
}
});


viewHolder.icon.setImageDrawable(Boolean.parseBoolean(bean.getIsFile()) ? context.getResources().getDrawable(R.drawable._16_file) : context.getResources().getDrawable(R.drawable._16_folder));
viewHolder.fileName.setText(bean.getName());
viewHolder.checkBox.setVisibility((Boolean.parseBoolean(bean.isCheckVisible))? View.VISIBLE : View.GONE);
viewHolder.checkBox.setChecked(Boolean.parseBoolean(bean.getIsChecked()));

viewHolder.fileName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!Boolean.parseBoolean(bean.getIsFile())) {
event.enterNextDir(fileOrDirList.get(position).getAbsolutePath());
}
}
});

return convertView;
}

static class ViewHolder {
private ImageView icon;
private TextView fileName;
private CheckBox checkBox;
}

public interface Event {
void enterNextDir(String path);//進入下一個文件夾
}

public void setData(List<string> data, ArrayList<fileordirbeans> fileOrDirList) {
this.fileOrDirList.clear();
this.fileOrDirList.addAll(fileOrDirList);

notifyDataSetChanged();
}

public void setEvent(Event event) {
this.event = event;
}

public ArrayList<string> getSelectData() {
return selectData;
}

}/<string>/<fileordirbeans>/<string>/<fileordirbeans>/<fileordirbeans>/<string>/<code>

第七步:創建FileAdapter每一項的佈局文件filechoose_layout_fileitme.xml

<code>
<relativelayout> android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >


<imageview> android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:class="lazy" src="//p2.ttnews.xyz/loading.gif" data-original="@drawable/file" />


<textview> android:id="@+id/fileName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:paddingRight="50dp"
android:layout_toRightOf="@+id/icon"
android:layout_centerVertical="true"
android:text="TextView" />

<checkbox> android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="8dp" />

/<checkbox>/<textview>/<imageview>/<relativelayout>/<code>

第八步:AndroidManifest 增加對文件操作的授權

<code><uses-permission>
<uses-permission>/<code>

第九步:用到的圖片資源_16_file.png和_16_folder.png


Android 目錄瀏覽支持文件夾、文件單選或者多選


Android 目錄瀏覽支持文件夾、文件單選或者多選


分享到:


相關文章: