動かざることバグの如し

近づきたいよ 君の理想に

指定したディレクトリのファイル名一覧を取得してリスト表示する

ListView思ったよりメンドクセ
今回主に使う変数は3つ。ファイル名の取得に必要なFile型、取得したファイル名たちを格納するためのString型のList、それらを表示するためのListViewである。

private File[] files;
private List<String> songList = new ArrayList<String>();
private ListView lv;

今回はSDカード直下にあるmp3ファイル名を取得してみる。SDカードのパスは機種によって異なるので以下のようにすると吉。

String sdPath = Environment.getExternalStorageDirectory().getPath();

次に以下でSDカード内のすべてのファイル名を取得できる。

files = new File(sdPath).listFiles();

あとはfor文でそれぞれ格納していけばいいのだが、このままだとファイルだけではなくディレクトリも入ってしまうので抽出する必要がある。Fileクラスには便利なメソッドがあり、isFile() でファイルかどうかがわかる。また拡張子がmp3だけにしたい場合はgetName().endsWith(".mp3")を使うと楽。

for(int i = 0; i < files.length; i++){
	if(files[i].isFile() && files[i].getName().endsWith(".mp3")){
		songList.add(files[i].getName());
	}
}

今回作ったサンプル

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private List<String> songList = new ArrayList<String>();
	private ListView lv;
	private File[] files;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		String sdPath = Environment.getExternalStorageDirectory().getPath();
		files = new File(sdPath).listFiles();
		if(files != null){
			for(int i = 0; i < files.length; i++){
				if(files[i].isFile() && files[i].getName().endsWith(".mp3")){
					songList.add(files[i].getName());
				}
			}
			
			lv = (ListView) findViewById(R.id.songlist);
			ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, songList);
			lv.setAdapter(adapter);
			
			lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
				@Override
				public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
					ListView listView = (ListView) parent;
					String item = (String) listView.getItemAtPosition(position);
					showItem(item);
				}
			});
		}
	}
	public void showItem(String str){
		Toast.makeText(this, "ファイル名:" + str, Toast.LENGTH_SHORT).show();
	}
}