일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Rxjava2
- Flutter TextField
- C
- 안드로이드
- Java
- 프로그래머스
- android architecture component
- Django REST Android
- 안드로이드 구글맵
- RxAndroid
- RxJava
- 코틀린
- livedata
- UWP
- android push
- flutter firestore
- kodility
- mfc
- Django REST
- Python
- Kotlin
- NDK
- Django REST framework
- FLUTTER
- 알고리즘
- Android P
- C/C++
- C++
- dart
- Android
- Today
- Total
개발하는 두더지
[Android/안드로이드] 안드로이드 파일 탐색기 구현 본문
개요
File 클래스와 ListView를 이용하여 파일 탐색기를 구현하도록 한다.
현재 폴더의 파일과 하위 폴더를 리스트 형식으로 출력하되, 하위 폴더를 터치하면 해당 하위 폴더로 이동하여 해당 하위 폴더의 내용을 보여주도록 한다.
만약 상위 폴더가 존재하는 경우에는 리스트에 “..”이라고 표시하고, 터치하면 상위 폴더로 이동할 수 있도록 한다.
목차
1. File 클래스 개요
2. ListView 개요
3. 구현 방법
4. 프로젝트 코드 설명
산출물
1. File 클래스 이해 및 적용 방법
2. ListView 이해 및 적용 방법
File
An "abstract" representation of a file system entity identified by a pathname. The pathname may be absolute (relative to the root directory of the file system) or relative to the current directory in which the program is running.
The actual file referenced by a File
may or may not exist. It may also, despite the name File
, be a directory or other non-regular file.
// 파일 또는 디렉토리를 사용 할 수 있도록 File 객체 생성
public File (String path)
Constructs a new file using the specified path.
// File 객체의 현재 디렉토리에 있는 파일 또는 디렉토리의 이름 리스트를 리턴
// 리스트의 현재 상태 . 부모 디렉토리 .. 로 가는 항목은 결과에 포함되지 않으므로 별도의 코드 필요
public String[] list ()
Returns an array of strings with the file names in the directory represented by this file. The result is null
if this file is not a directory.
The entries .
and ..
representing the current and parent directory are not returned as part of the list.
// 현재 파일 또는 디렉토리의 절대 경로를 리턴
public String getAbsolutePath ()
Returns the absolute path of this file. An absolute path is a path that starts at a root of the file system. On Android, there is only one root: /
.
ListView
A view that shows items in a vertically scrolling list. The items come from the ListAdapter
associated with this view.
// 어댑터는 데이터를 관리하고 뷰에 리스트를 보여주는 역할을 한다
// 현재 사용하고 있는 리스트뷰에 따라 다르게 나타날 수 있다
public void setAdapter (ListAdapter adapter)
Sets the data behind this ListView. The adapter passed to this method may be wrapped by a WrapperListAdapter
, depending on the ListView features currently in use. For instance, adding headers and/or footers will cause the adapter to be wrapped.
Parameters
adapter | The ListAdapter which is responsible for maintaining the data backing this list and for producing a view to represent an item in that data set. |
---|
ArrayAdapter
A concrete BaseAdapter that is backed by an array of arbitrary objects. By default this class expects that the provided resource id references a single TextView. If you want to use a more complex layout, use the constructors that also takes a field id. That field id should reference a TextView in the larger layout resource.
// context : 현재 어댑터로 보여줄 리스트 뷰를 포함한 액티비티의 컨텍스트
// resource : 리스트를 어떻게 보여줄 것인지 결정
// objects : 리스트 뷰에 나타날 아이템 목록
public ArrayAdapter (Context context, int resource, List<T> objects)
Constructor
Parameters
context | The current context. |
---|---|
resource | The resource ID for a layout file containing a TextView to use when instantiating views. |
objects | The objects to represent in the ListView. |
// 뷰의 변경 사항을 반영하기 위한 메소드로 별도의 호출이 필요하다
// 호출이 없으면 변경된 결과가 반영되지 않는다.
public void notifyDataSetChanged ()
Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.
파일 탐색기 구현 방법
1. RootPath를 구한다
2. 루트 패스의 파일 리스트를 구해온다
3. 리스트 뷰에 어댑터를 셋팅한다
4. 어댑터에 파일 리스트를 세팅한다
5. 결과를 반영시켜준다
소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | public class MainActivity extends AppCompatActivity { private TextView textView; private ListView listView; private ArrayAdapter<String> listAdapter; private ArrayList<String> items; private String rootPath = ""; private String nextPath = ""; private String prevPath = ""; private String currentPath = ""; private TextView messageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.textView); listView = (ListView)findViewById(R.id.listView); items = new ArrayList<>(); listAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, items); // 루트 경로 가져오기 rootPath = Environment.getExternalStorageDirectory().getAbsolutePath(); boolean result = Init(rootPath); if ( result == false ) return; listView.setAdapter(listAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.d("KJH_TEST", position + " : " + items.get(position).toString()); currentPath = textView.getText().toString(); String path = items.get(position).toString(); if (path.equals("..")) { prevPath(path); } else { nextPath(path); } } }); } public boolean Init(String rootPath) { // 파일 객체 생성 File fileRoot = new File(rootPath); if(fileRoot.isDirectory() == false) { Toast.makeText(MainActivity.this, "Not Directory" , Toast.LENGTH_SHORT).show(); return false; } textView.setText(rootPath); // 파일 리스트 가져오기 String[] fileList = fileRoot.list(); if ( fileList == null ) { Toast.makeText(MainActivity.this, "Could not find List" , Toast.LENGTH_SHORT).show(); return false; } // 아이템 리스트 전부 삭제 items.clear(); // 리스트의 첫 항목은 뒤로가기 위해 ".." 세팅 items.add(".."); for ( int i = 0; i < fileList.length; i++ ) { items.add(fileList[i]); } // 리스트 뷰에 적용 listAdapter.notifyDataSetChanged(); return true; } public void nextPath(String str) { prevPath = currentPath; // 현재 경로에서 / 와 다음 경로 붙이기 nextPath = currentPath + "/" + str; File file = new File(nextPath); if ( file.isDirectory() == false ) { Toast.makeText(MainActivity.this, "Not Directory" , Toast.LENGTH_SHORT).show(); return; } String[] fileList = file.list(); items.clear(); items.add(".."); for ( int i = 0; i < fileList.length; i++ ) { items.add(fileList[i]); } textView.setText(nextPath); listAdapter.notifyDataSetChanged(); } public void prevPath(String str) { nextPath = currentPath; prevPath = currentPath; // 마지막 / 의 위치 찾기 int lastSlashPosition = prevPath.lastIndexOf("/"); // 처음부터 마지막 / 까지의 문자열 가져오기 prevPath = prevPath.substring(0, lastSlashPosition); File file = new File(prevPath); if ( file.isDirectory() == false) { Toast.makeText(MainActivity.this, "Not Directory" , Toast.LENGTH_SHORT).show(); return; } String[] fileList = file.list(); items.clear(); items.add(".."); for( int i = 0; i < fileList.length; i++ ) { items.add(fileList[i]); } textView.setText(prevPath); listAdapter.notifyDataSetChanged(); } Colored by Color Scriptercs | cs |
'Java,Android' 카테고리의 다른 글
[Android/안드로이드] Service와 BroadcastReceiver로 스크린 화면 감지하기 (7) | 2016.07.22 |
---|---|
[Android/안드로이드/자바] Thread, Runnable, Handler 에 대해 알아보기 (0) | 2016.07.22 |
[Android/안드로이드] InputStream, OutputStream을 활용한 동영상 다운로드 및 재생 (0) | 2016.07.22 |
[Android/안드로이드] sdcard 절대 경로 찾기 - JellyBean(젤리빈) 이상부터 내장 메모리의 변동, galaxy S3, S4 sdcard 문제 (0) | 2016.07.22 |
[Android/안드로이드] 안드로이드 Context란? 기능과 사용 방법 (1) | 2016.07.22 |