package app.main;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class FileList extends ListView {
public FileList(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public FileList(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public FileList(Context context) {
super(context);
init(context);
}
private void init(Context context) {
_Context = context;
setOnItemClickListener(_OnItemClick);
}
private Context _Context = null;
private ArrayList<String> _List = new ArrayList<String>();
private ArrayList<String> _FolderList = new ArrayList<String>();
private ArrayList<String> _FileList = new ArrayList<String>();
private ArrayAdapter<String> _Adapter = null;
// Property
private String _Path = "";
// Event
private OnPathChangedListener _OnPathChangedListener = null;
private OnFileSelectedListener _OnFileSelectedListener = null;
private boolean openPath(String path) {
_FolderList.clear();
_FileList.clear();
File file = new File(path);
File[] files = file.listFiles();
if (files == null) return false;
for (int i=0; i<files.length; i++) {
if (files[i].isDirectory()) {
_FolderList.add("<" + files[i].getName() + ">");
} else {
_FileList.add(files[i].getName());
}
}
Collections.sort(_FolderList);
Collections.sort(_FileList);
_FolderList.add(0, "<..>");
return true;
}
private void updateAdapter() {
_List.clear();
_List.addAll(_FolderList);
_List.addAll(_FileList);
_Adapter = new ArrayAdapter<String>(_Context, android.R.layout.simple_list_item_1, _List);
setAdapter(_Adapter);
}
public void setPath(String value) {
if (value.length() == 0) {
value = "/";
} else {
String lastChar = value.substring(value.length()-1, value.length());
if (lastChar.matches("/") == false) value = value + "/";
}
if (openPath(value)) {
_Path = value;
updateAdapter();
if (_OnPathChangedListener != null) _OnPathChangedListener.onChanged(value);
}
}
public String getPath() {
return _Path;
}
public void setOnPathChangedListener(OnPathChangedListener value) {
_OnPathChangedListener = value;
}
public OnPathChangedListener getOnPathChangedListener() {
return _OnPathChangedListener;
}
public void setOnFileSelected(OnFileSelectedListener value) {
_OnFileSelectedListener = value;
}
public OnFileSelectedListener getOnFileSelected() {
return _OnFileSelectedListener;
}
public String DelteRight(String value, String border) {
String list[] = value.split(border);
String result = "";
for (int i=0; i<list.length; i++) {
result = result + list[i] + border;
}
return result;
}
private String delteLastFolder(String value) {
String list[] = value.split("/");
String result = "";
for (int i=0; i<list.length-1; i++) {
result = result + list[i] + "/";
}
return result;
}
private String getRealPathName(String newPath) {
String path = newPath.substring(1, newPath.length()-1);
if (path.matches("..")) {
return delteLastFolder(_Path);
} else {
return _Path + path + "/";
}
}
private AdapterView.OnItemClickListener _OnItemClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
String fileName = getItemAtPosition(position).toString();
if (fileName.matches("<.*>")) {
setPath(getRealPathName(fileName));
} else {
if (_OnFileSelectedListener != null) _OnFileSelectedListener.onSelected(_Path, fileName);
}
}
};
}
지금 퍼즐 앱을 위한 이미지를 받아오기위해 sdcard에서 직접 찾으려고 하는데요
류종택님의 티스토리에서 대강의 코드는 이해했으나
잘 모르겠으므로 질문 올려봅니다.
일단 저 코드로 파일탐색기 켜지는데요
문제점이... sdcard 에서 다른폴더 하나를 들어간뒤!
그다음 폴더에서 예를들면
제 핸드폰기준
/sdcard/Picture/ 이다음에 올 폴더에서
폴더명이 2글자 이하인걸 클릭하는 순간
파일패스가 /sdcard/ 로 돌아갑니다...
물론 그 이상 3글자라도 되는 폴더를 클릭시(예를들어 폴더명이 '가나다')면
/sdcard/Picture/가나다/
이렇게 잘 됩니다...
아직 안드로이드 코드 배운지 몇일 안되서 어디서 이러한 문제가 발생하는지 모르겠습니다.
일일히 폴더명을 1,2,3,4글자 바꿔가면서 정확히 몇글자 부터 오류인지 확인뒤
코드를 직접보고 어댑터뷰.온아이템클릭리스너 쪽에서
파일이름이 문자열에 저장되는걸보고, 그 파일이름을 getRealPathName에 가는거 보고 거기도 보고,
거기서 리턴해준게 setPath간것도 확인해봤지만...
제 수준으론 어째서 2글짜 짜리 폴더는 클릭하는 순간
/sdcard/Picture/두글짜 폴더명 이 아닌 예를들어 폴더명이 'ab'라면
/sdcard/Picture/ab/
/sdcard/로 변경되는지 알고싶습니다.
아 참고로 Picture안에 3글자자리가 있고
그안에 2글자 짜리가 있을때는
/sdcard/Picture/abc/ab
가 아니라
/sdcard/Picture/로 돌아갑니다.
한단계 뒤로 가버리네요...