我的PDF阅读器之ChoosePDFActivity解析

所有的解析都放在代码的解析中了,直接看代码吧

package com.artifex.mupdfdemo;



import android.app.AlertDialog;

import android.app.ListActivity;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.content.Intent;

import android.content.res.Resources;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.os.FileObserver;

import android.os.Handler;

import android.view.View;

import android.widget.ListView;



import java.io.File;

import java.io.FileFilter;

import java.util.Arrays;

import java.util.Comparator;

import java.util.HashMap;

import java.util.Map;



/**

 * 选择文件类

 */

public class ChoosePDFActivity extends ListActivity {

    public static final String TAG = ChoosePDFActivity.class.getName();



    static private File  mDirectory;

    //保存上一级目录的名称,及其滑动到的地方

    static private Map<String, Integer> mPositions = new HashMap<String, Integer>();

    private File         mParent;//父目录

    private File []      mDirs;//当前父目录下的文件夹

    private File []      mFiles;//当前父目录下的文件

    private Handler         mHandler;

    private Runnable     mUpdateFiles;

    private ChoosePDFAdapter adapter;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);



        String storageState = Environment.getExternalStorageState();



        if (!Environment.MEDIA_MOUNTED.equals(storageState)

                && !Environment.MEDIA_MOUNTED_READ_ONLY.equals(storageState))

        {

            AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setTitle(R.string.no_media_warning);

            builder.setMessage(R.string.no_media_hint);

            AlertDialog alert = builder.create();

            alert.setButton(AlertDialog.BUTTON_POSITIVE,"Dismiss",

                    new OnClickListener() {

                        public void onClick(DialogInterface dialog, int which) {

                            finish();

                        }

                    });

            alert.show();

            return;

        }



        //把download文件夹作为根目录

        if (mDirectory == null)

            mDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);



        // Create a list adapter...

        adapter = new ChoosePDFAdapter(getLayoutInflater());

        setListAdapter(adapter);



        // ...that is updated dynamically when files are scanned

        mHandler = new Handler();

        mUpdateFiles = new Runnable() {

            public void run() {

                Resources res = getResources();

                String appName = res.getString(R.string.app_name);

                String version = res.getString(R.string.version);

                String title = res.getString(R.string.picker_title);

                setTitle(String.format(title, appName, version, mDirectory));



                mParent = mDirectory.getParentFile();



                //选择文件夹

                mDirs = mDirectory.listFiles(new FileFilter() {



                    public boolean accept(File file) {

                        return file.isDirectory();

                    }

                });

                if (mDirs == null)

                    mDirs = new File[0];





                //fileFilter 一个选择文件的抽象类

                //选择文件

                mFiles = mDirectory.listFiles(new FileFilter() {



                    public boolean accept(File file) {

                        if (file.isDirectory())

                            return false;

                        String fname = file.getName().toLowerCase();

                        if (fname.endsWith(".pdf"))

                            return true;

                        if (fname.endsWith(".xps"))

                            return true;

                        if (fname.endsWith(".cbz"))

                            return true;

                        return false;

                    }

                });

                if (mFiles == null)

                    mFiles = new File[0];



                //排序文件和文件夹

                Arrays.sort(mFiles, new Comparator<File>() {

                    public int compare(File arg0, File arg1) {

                        return arg0.getName().compareToIgnoreCase(arg1.getName());

                    }

                });



                Arrays.sort(mDirs, new Comparator<File>() {

                    public int compare(File arg0, File arg1) {

                        return arg0.getName().compareToIgnoreCase(arg1.getName());

                    }

                });



                adapter.clear();//清除之前的东西

                //添加内容

                if (mParent != null)//添加返回上一层的按钮

                    adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.PARENT, "[Up one level]"));

                //添加目录和文件

                for (File f : mDirs)

                    adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.DIR, f.getName()));

                for (File f : mFiles)

                    adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.DOC, f.getName()));



                lastPosition();//?????不知道干嘛

            }

        };



        // Start initial file scan...

        mHandler.post(mUpdateFiles);



        // ...and observe the directory and scan files upon changes.

        //fileObserver 一个监听文件变化的抽象类

        FileObserver observer = new FileObserver(mDirectory.getPath(), FileObserver.CREATE | FileObserver.DELETE) {

            public void onEvent(int event, String path) {

                mHandler.post(mUpdateFiles);

            }

        };

        observer.startWatching();

    }



    /**

     * 判读这个目录是否之前来过的,如果是就回到上次滑动到的地方

     */

    private void lastPosition() {

        String p = mDirectory.getAbsolutePath();

        if (mPositions.containsKey(p)){

            getListView().setSelection(mPositions.get(p));

//            Log.v(TAG,p+"--->"+mPositions.get(p)); //debug

        }



    }



    @Override

    protected void onListItemClick(ListView l, View v, int position, long id) {

        super.onListItemClick(l, v, position, id);



        //当用户点击的时候表示进入了新目录,记录下旧目录下的信息

        mPositions.put(mDirectory.getAbsolutePath(), getListView().getFirstVisiblePosition());



        //当mParent 为空时表示到了根目录,下面的代码不会执行。

        //当position为0时,表示为返回上一层目录

        if (position < (mParent == null ? 0 : 1)) {

            mDirectory = mParent;

            mHandler.post(mUpdateFiles);

            return;

        }



        //因为listView中多了个返回上一层,所以具体的位置应该是position-1

        position -= (mParent == null ? 0 : 1);



        //如果在目录的范围内,就更新目录

        if (position < mDirs.length) {

            mDirectory = mDirs[position];

            mHandler.post(mUpdateFiles);

            return;

        }



        //算出文件的位置

        position -= mDirs.length;



        Uri uri = Uri.parse(mFiles[position].getAbsolutePath());

        Intent intent = new Intent(this,MuPDFActivity.class);

        intent.setAction(Intent.ACTION_VIEW);

        intent.setData(uri);

        startActivity(intent);

    }



    @Override

    protected void onPause() {

        super.onPause();

        mPositions.put(mDirectory.getAbsolutePath(), getListView().getFirstVisiblePosition());

    }

}

下一步,我将会在这个的基础上弄一个自己的文件浏览器

你可能感兴趣的:(Activity)