我的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());
    }
}

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

posted @ 2013-07-17 23:40  @47  阅读(595)  评论(0编辑  收藏  举报