개발하는 두더지

[Android/안드로이드] 안드로이드 파일 탐색기 구현 본문

Java,Android

[Android/안드로이드] 안드로이드 파일 탐색기 구현

덜지 2016. 7. 22. 01:43

개요


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)

Added in API level 1

Constructs a new file using the specified path.


// File 객체의 현재 디렉토리에 있는 파일 또는 디렉토리의 이름 리스트를 리턴

// 리스트의 현재 상태 .  부모 디렉토리 .. 로 가는 항목은 결과에 포함되지 않으므로 별도의 코드 필요

public String[] list ()

Added in API level 1

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 ()

Added in API level 1

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)

Added in API level 1

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)

Added in API level 1

Constructor

Parameters
contextThe current context.
resourceThe resource ID for a layout file containing a TextView to use when instantiating views.
objectsThe objects to represent in the ListView.


// 뷰의 변경 사항을 반영하기 위한 메소드로 별도의 호출이 필요하다

// 호출이 없으면 변경된 결과가 반영되지 않는다.

public void notifyDataSetChanged ()

Added in API level 1

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("..");
 
        forint i = 0; i < fileList.length; i++ )        {
            items.add(fileList[i]);
        }
 
        textView.setText(prevPath);
        listAdapter.notifyDataSetChanged();
    } 
 
Colored by Color Scriptercs
cs



 


Comments