如何呈現目錄下的所有資料夾

如何呈現目錄下的所有資料夾

如果想要做一個只顯示資料夾的檔案總管, 該怎麼做?

        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);
    }

這樣就可以把第一層的目錄全部抓出來。



程式碼