ファイル選択機能の改善 - 壁紙変更アプリ (12)
引き続きファイル選択機能を改善します。
壁紙選択アプリなので、画像ファイル以外を表示しないようにします。
private String[] permExte = {"jpeg", "jpg", "bmp", "png"};
private void createFileList() { if (files != null) { for (int i = 0; i < files.length; i++) { if(files[i].isDirectory()) { item_list.add(files[i].getName()); } else { String fileName = files[i].getName(); for (int n = 0; n < permExte.length; n++) { if (fileName.substring(fileName.lastIndexOf(".") + 1).equals(permExte[n])) { item_list.add(fileName); break; } } } } } if (!curPath.equals("/")) { item_list.add(".."); } }
ただ、画像ファイル以外のファイルが表示されなくなることで、
ファイルリスト files と表示用リスト item_list にズレができました。
なので、今まで files[position] で評価していましたが、
item_list.get(position) からファイル名 curFile を取得して、
これを評価するように変更します。
上記修正によって、いままで表示用リストの最後にあった ".." を、
一番上に移動できました。自然な感じになったよ。
全体としてはこんな感じ。
色々無駄な処理がある気がするなぁ。。
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub); mWM = WallpaperManager.getInstance(this); listview = (ListView) findViewById(R.id.listview); item_list = new ArrayList<String>(); // Hard-coded files position. //files = new File("/storage/sdcard0/Pictures/Screenshots").listFiles(); curPath = "/storage/sdcard0"; //files = new File("/storage/sdcard0/").listFiles(); files = new File(curPath).listFiles(); // Get files list createFileList(); ArrayAdapter<String> arrayadapter = new ArrayAdapter<String> (SubActivity.this, android.R.layout.simple_expandable_list_item_1, item_list); listview.setAdapter(arrayadapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String click_parent = (String) parent.getClass().getSimpleName(); String click_position = String.valueOf(position); String click_id = String.valueOf(id); Log.v(TAG, String.format("onItemClick click_parent : %s", click_parent)); Log.v(TAG, String.format("onItemClick click_position : %s", click_position)); Log.v(TAG, String.format("onItemClick click_id : %s", click_id)); Log.v(TAG, "item_list to file:"+curPath+item_list.get(position)); File curFile = new File(curPath, item_list.get(position)); if(item_list.get(position).equals("..")) { item_list.clear(); curPath = curPath.substring(0, curPath.lastIndexOf(File.separator)); if(curPath.equals("")) { curPath = "/"; } files = new File(curPath).listFiles(); createFileList(); ArrayAdapter<String> arrayadapter = new ArrayAdapter<String> (SubActivity.this, android.R.layout.simple_expandable_list_item_1, item_list); listview.setAdapter(arrayadapter); } else if(curFile.isDirectory()) { item_list.clear(); curPath = curFile.getPath(); Log.v(TAG, "curPath = "+curPath); files = new File(curFile.toString()).listFiles(); createFileList(); ArrayAdapter<String> arrayadapter = new ArrayAdapter<String> (SubActivity.this, android.R.layout.simple_expandable_list_item_1, item_list); listview.setAdapter(arrayadapter); } else if(files != null) { if(curFile.isFile()) { // Implementation for changing the wallpaper Log.v(TAG, "onItemClick:" + curFile.toString()); bmpImageFile = BitmapFactory.decodeFile(curFile.toString()); int height = mWM.getDesiredMinimumHeight(); int width = mWM.getDesiredMinimumWidth(); Log.v(TAG, "before height:" + height); Log.v(TAG, "before width:" + width); //Bitmap resizeBmp = Bitmap.createScaledBitmap(bmpImageFile, 1920, 1200, true); try { mWM.setBitmap(bmpImageFile); //mWM.setBitmap(resizeBmp); mWM.suggestDesiredDimensions(1200, 1920); height = mWM.getDesiredMinimumHeight(); width = mWM.getDesiredMinimumWidth(); Log.v(TAG, "after height:" + height); Log.v(TAG, "after width:" + width); } catch (IOException e) { e.printStackTrace(); } finish(); } } } }); } /** * Crate file list */ private void createFileList() { if (!curPath.equals("/")) { item_list.add(".."); } if (files != null) { for (int i = 0; i < files.length; i++) { if(files[i].isDirectory()) { item_list.add(files[i].getName()); } else { String fileName = files[i].getName(); for (int n = 0; n < permExte.length; n++) { if (fileName.substring(fileName.lastIndexOf(".") + 1).equals(permExte[n])) { item_list.add(fileName); break; } } } } } }
次はランダムに画像変更を出来るようにしてみます。