【Android】ファイルを種類別とかファイル名順に一覧表示する

Android

ファイルを読み込んだ後にソート処理を行う必要があります。Javaでは、Arrays.sort()Collections.sort() を使用して簡単にソートできます。

以下に具体的な例を示します:

ファイルを名前順にソートする場合

java

import java.io.File;
import java.util.Arrays;

public void displayFilesSortedByName() {
    File directory = new File(mSharedViewModel.mStorageDataPath);
    File[] files = directory.listFiles();
    if (files != null) {
        // ファイル名でソート
        Arrays.sort(files, (f1, f2) -> f1.getName().compareToIgnoreCase(f2.getName()));

        for (File file : files) {
            if (file.isDirectory()) {
                Log.d(TAG, "[フォルダ] " + file.getName());
            } else if (file.isFile()) {
                Log.d(TAG, "[ファイル] " + file.getName());
            }
        }
    }
}

種類別 (フォルダ→ファイルの順) にソートする場合

まず、フォルダを優先して表示し、次にファイルを表示するようにします。

java

import java.io.File;
import java.util.Arrays;

public void displayFilesSortedByType() {
    File directory = new File(mSharedViewModel.mStorageDataPath);
    File[] files = directory.listFiles();
    if (files != null) {
        // 種類 (フォルダ優先) でソート
        Arrays.sort(files, (f1, f2) -> {
            if (f1.isDirectory() && !f2.isDirectory()) {
                return -1; // フォルダを先に
            } else if (!f1.isDirectory() && f2.isDirectory()) {
                return 1;  // ファイルを後に
            } else {
                return f1.getName().compareToIgnoreCase(f2.getName()); // 名前順
            }
        });

        for (File file : files) {
            if (file.isDirectory()) {
                Log.d(TAG, "[フォルダ] " + file.getName());
            } else if (file.isFile()) {
                Log.d(TAG, "[ファイル] " + file.getName());
            }
        }
    }
}

拡張子でソートする場合

拡張子を基準にソートし、同じ拡張子の場合はファイル名でソートします。

java

import java.io.File;
import java.util.Arrays;

public void displayFilesSortedByExtension() {
    File directory = new File(mSharedViewModel.mStorageDataPath);
    File[] files = directory.listFiles();
    if (files != null) {
        // 拡張子でソート
        Arrays.sort(files, (f1, f2) -> {
            String ext1 = getFileExtension(f1);
            String ext2 = getFileExtension(f2);
            int extComparison = ext1.compareToIgnoreCase(ext2);
            if (extComparison == 0) {
                return f1.getName().compareToIgnoreCase(f2.getName()); // ファイル名でソート
            }
            return extComparison;
        });

        for (File file : files) {
            if (file.isDirectory()) {
                Log.d(TAG, "[フォルダ] " + file.getName());
            } else if (file.isFile()) {
                Log.d(TAG, "[ファイル] " + file.getName());
            }
        }
    }
}

// 拡張子を取得するヘルパーメソッド
private String getFileExtension(File file) {
    String name = file.getName();
    int lastDotIndex = name.lastIndexOf('.');
    if (lastDotIndex != -1 && lastDotIndex < name.length() - 1) {
        return name.substring(lastDotIndex + 1);
    }
    return ""; // 拡張子なし
}

解説

  1. Arrays.sort の使用:
    • Comparator を定義してカスタムのソートロジックを記述しています。
    • ソート基準として名前、種類、拡張子などを指定。
  2. 複数条件のソート:
    • 種類別ソートでは、フォルダとファイルを区別しながら名前順に並べています。
    • 拡張子ソートでは、拡張子を比較した後、同じ拡張子内でファイル名順にソート。
  3. ヘルパーメソッド:
    • 拡張子の取得には getFileExtension() を使用。

これで種類別、ファイル名順、拡張子順など柔軟なソートが可能になります

コメント