0

アプリの一部として、特定のフォルダーのみを一覧表示するファイル ブラウザーが必要です。たとえば、任意のレベルのサブフォルダーのいずれかにある画像ファイルのパスにあるフォルダーのみを一覧表示します。

再帰を使用してそれを行うことができました。しかし、それはパフォーマンスに影響します。特に最上位のフォルダーを見つけるには、多くの再帰呼び出しが必要です。それを行うためのより良い方法はありますか

以下の私のコードを見てください

public List<GeneralFileItem> getGridItemsList(String root) {
    List<GeneralFileItem> gridItemsList = new ArrayList<GeneralFileItem>();
    File file;
    file = new File(root);
    File list[] = file.listFiles();
    if (list.length == 0) {
        return null;
    }
    for (int i = 0; i < list.length; i++) {
        GeneralFileItem item = new GeneralFileItem();
        File temp_file = new File(file.getAbsolutePath(), list[i].getName());
        if (hasPhoto(temp_file)) {
            item.setPath(file.getAbsolutePath() + "/" + list[i].getName());
            item.setName(list[i].getName());
            if (temp_file.listFiles() != null) {
                item.setType(GeneralFileItem.DIRECTORY_TYPE);
            } else {
                item.setType(GeneralFileItem.FILE_TYPE);
            }
            gridItemsList.add(item);
            //Log.i(TAG,"added"+list[i].getName());
        }
    }
    return gridItemsList;

}

private boolean hasPhoto(File temp_file) {
    //Log.i(TAG,temp_file.getName());

    if (temp_file.listFiles() == null) {
        if (temp_file.getName().toUpperCase().endsWith(("JPG"))) {
            //Log.i(TAG,temp_file.getName()+ "is a photo");
            return true;
        } else
            return false;

    }
    else{
        File list[] = temp_file.listFiles();

        for (int i = 0; i < list.length; i++) {
            if(hasPhoto(list[i]))
                return true;
        }

    }

    return false;
}

再帰検索以外の方法があれば知りたいです。ファイルは Android でどのように維持されますか。さまざまなファイル システムがサポートされており、ハードウェア メーカーによって異なることはわかっています。すべての .jpg ファイルを取得できる FileTable があるかどうかのような方法があるかどうかを知りたいです。

4

3 に答える 3

0

FilenameFilterを使用して、特定のタイプのファイルを検索します。

現在、現在のディレクトリのみをチェックしています。ただし、再帰的に検索する場合は、見つかった各ファイルがディレクトリであるかどうかをチェックする必要があります。

あなたのアルゴは次のようになります

File file;
file = new File(root);
File list[] = file.listFiles();
if (list.length == 0) {
    return null;
}
for (int i = 0; i < list.length; i++) {
     if(list[i].isDirectory()){
        //Then go inside it to search for specific file 
        File subList[] = list[i].listFiles();
        //search for jpg..
        }else if("is this jpg"){
         //Add to list
        }
     }

これを単純化するために、要件に従ってこれらをメソッドに分離することができます。

于 2012-05-16T08:00:04.843 に答える
0

ここに私が思いついたことがあります!それは魅力のように機能します!

まず、ファイルを作成する必要があります。これは SD カードのルートです。

File = rootPrimary = new File(Environment.getExternalStorageDirectory());

すべてのファイルを File [] にリストする必要があるよりも

File[] fileArray = rootDirectory.listFiles();

次に、ArrayList を作成し、作成したメソッドと同じに設定し、File[] を渡します。

ArrayList<File> alFolders = new ArrayList<File>();
        alFolder = putImgFldr(fileArray);

このメソッドは、拡張子が .jpg および .png の画像を含むすべてのディレクトリを追加します。

private ArrayList<File> putImgFldr(File[] fileArray) {
        // TODO Auto-generated method stub
        ArrayList<File> a = new ArrayList<File>();

        for (int i = 0; i < fileArray.length; i++) {
            if (fileArray[i].isDirectory()) {
                //if file is folder pass that file trough this method
                a.addAll(putImgFldr(fileArray[i].listFiles()));
            } else if (fileArray[i].getAbsolutePath().endsWith(".jpg") || fileArray[i].getAbsolutePath().endsWith(".png")) {
                // if file is img ad it's parent, folder to ArrayList 
                a.add(fileArray[i].getParentFile());
                // this finishes the file searching 
                // because the image has allready bean found
                i = fileArray.length + 1;
            }
        }
        return a;
    }

必要に応じて、別のファイル [] を alFolders に追加できます

alFolders.addAll(putImgFldr(secFileArray));
于 2016-01-31T16:39:18.043 に答える