Givemepass's Android 惡補筆記

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

| Comments

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

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

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

程式碼

Comments

comments powered by Disqus