如果想要做一個只顯示資料夾的檔案總管, 該怎麼做?
public ArrayList<File> filter(File[] fileList) {
ArrayList<File> files = new ArrayList<File>();
if(fileList == null){
return files;
}
for(File file: fileList) {
if(!file.isDirectory() && file.isHidden()) {
continue;
}
files.add(file);
}
Collections.sort(files);
return files;
}
就可以把所有的檔案以及資料夾全部列出來。
可以看到我們把第一層檔案陣列丟進來以後, 就可以利用file的一些屬性對這些檔案進行整理,
其中可以看到中間判斷檔案是否為資料夾以及是否為隱藏檔,
若是則不處理, 最後把抓到的file全部存成陣列回傳出去。
簡單做個範例,首先在layout內宣告一個listview
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/path"
android:layout_width="match_parent"
android:layout_height="30dp" />
<View
android:layout_below="@id/path"
android:id="@+id/divider"
android:background="#909090"
android:layout_width="match_parent"
android:layout_height="1px"/>
<ListView
android:layout_below="@id/divider"
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
再來就是宣告一個類別來安排我們的adapter。
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return files.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
Holder holder;
if(v == null){
v = LayoutInflater.from(mContext).inflate(R.layout.list_item, null);
holder = new Holder();
holder.textView = (TextView) v.findViewById(R.id.text);
v.setTag(holder);
} else{
holder = (Holder) v.getTag();
}
String filePath = files.get(position).getPath();
String fileName = FilenameUtils.getName(filePath);
holder.textView.setText(fileName);
return v;
}
private class Holder{
TextView textView;
}
}
這邊有用到一個第三方,記得在gradle內加入
compile files('libs/commons-io-2.4.jar')
那麼我們的主程式怎麼寫呢?
private ListView mListView;
private MyAdapter mAdapter;
private Context mContext;
private ArrayList<File> files;
private File mDir;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = getApplicationContext();
mDir = Environment.getExternalStorageDirectory();
files = filter(mDir.listFiles());
mListView = (ListView) findViewById(R.id.list);
mAdapter = new MyAdapter();
mListView.setAdapter(mAdapter);
}
這樣就可以把第一層的目錄全部抓出來。