Download presentation
Presentation is loading. Please wait.
1
어댑터뷰 리스트 뷰, 그리드 뷰, 스피너, 갤러리 등을 묶어 어댑터 뷰라 부름
- 표시할 항목 데이터를 어댑터(Adapter) 객체로부터 공급 받음 - 기능적으로 집합을 표시한다는 면에서 동일하지만, 항목을 표시하는 방법은 다름 항목들의 집합을 표시하는 위젯들 - 공동 조상인 AdapterView는 ViewGroup로부터 파생 - 어댑터 뷰들은 항목에 해당하는 여러 개의 차일드 뷰를 가질 수 있음 - 사용자와 상호 작용도 처리 AdapterView AbsListView AbsSpinner ListView GridView Spinner Gallery ExpandedListView ViewGroup View
2
ArrayAdapter<T>
어댑터 어댑터 뷰에 데이터를 공급하는 객체로 원본으로부터 얻은 데이터를 관리하며, 어댑터 뷰는 어댑터가 전달한 데이터를 화면에 표시 어댑터의 계층 - Adapter ㆍ어댑터 뷰와 데이터 간의 연결 제공 ㆍ항목들의 집합을 관리하는 기본적인 메서드 선언 - ListAdapter ㆍ리스트 뷰와 연결에 필요한 메서드 정의 - SpinnerAdapter ㆍ스피너와 연결에 필요한 메서드 정의 - BaseAdapter 추상 클래스 ㆍ두 인터페이스의 메서드 중 기본적인 것들 구현 - BaseAdapter 파생 클래스 ㆍ항목들의 원본이 어디인가에 따라 나뉨 ㆍArrayAdapter ㆍCursorAdapter ㆍSimpleAdapter Adapter ListAdapter SpinnerAdapter BaseAdapter ArrayAdapter<T> CursorAdapter SimpleAdapter
3
ArrayAdapter 두 번째 인수는 항목을 표시할 레이아웃의 리소스 ID
ArrayAdapter(Context context, int textViewResourceId, List<T> objects) ArrayAdapter(Context context, int textViewResourceId, T[] objects) 두 번째 인수는 항목을 표시할 레이아웃의 리소스 ID - 레이아웃 안에는 텍스트 뷰, 이미지 뷰, 체크 박스, 라디오 버튼 등을 배치 - 안드로이드에서 제공하는 레이아웃을 사용 가능 - 목록 표시용으로 미리 정의해 놓은 것으로 android.R. 뒤에 ID를 지정하여 사용 세 번째 인수는 데이터의 원본이며 두 가지 타입에 대해 오버로딩 - 위쪽 생성자 : List 인터페이스를 지원하는 컬렉션 객체가 원본 ArrayList가 대표적이며, LinkedList, Stack 등 - 아래쪽 생성자 : 단순 배열을 원본으로 함
4
ArrayAdapter ListTest (1 / 2)
5
ArrayAdapter ListTest (2 / 2)
6
ArrayAdapter 실행결과
7
ListView 어댑터 뷰의 대표 위젯으로 항목들을 수직으로 펼쳐서 보여주며, 스크롤을 지원
어댑터 객체 준비 후 리스트 뷰의 메서드를 호출하여 연결 - 어댑터는 리스트 뷰에 출력할 데이터 원본을 가지며, 원본을 출력할 뷰를 생성하여 리스트 뷰에 제공. - 리스트 뷰는 어댑터가 제공한 뷰를 사용자에게 보여줌. - 사용자로부터 터치 입력을 받아 항목 선택 및 스크롤 처리 배열도 일종의 리소스이며, 문자열 배열은 string-array 엘리먼트로 작성 - name 속성 : 배열 리소스의 이름 지정 - item 엘리먼트 : 배열 요소 나열 ※ 코드에서 문자열 배열을 직접 정의하는 것은 비효율적이며 관리에도 불리하다. ※ 고정적인 문자열은 리소스에 정의해 놓고 사용하는 것이 바람직하다.
8
ListView 리소스의 배열을 원본으로 하는 어댑터 생성 시 정적 메서드를 호출
두 번째 인수로 문자열 배열의 ID 지정, 세 번째 인수로 레이아웃을 지정 - 문자열 배열의 ID는 R.string.country이며, 레이아웃은 기본 레이아웃을 사용 - CharSequence의 배열을 원본으로 가지는 어댑터가 생성, 리턴되며 이를 리스트 뷰와 연결 - 배열이 리소스에 정의되어 있으므로 코드가 짧아짐
9
ListView ListTest2 (1 / 3)
10
ListView ListTest2 (2 / 3)
11
ListView ListTest2 (3 / 3)
12
ListView 실행결과
13
ListView choiceMode - 항목을 선택하는 모드
- 리스트 뷰의 항목은 디폴트로 클릭만 가능할 뿐 선택은 할 수 없지만 이 속성을 지정하면 하나 또는 복수 개의 항목을 선택할 수 있음 - 코드에서 선택 모드를 조사하거나 변경 시 get(set)ChoiceMode 메서드를 사용 - 반드시 속성에 맞는 레이아웃을 같이 적용해야 함 - 선택을 허용하려면 사용자가 누를 수 있는 체크 박스나 라디오 버튼이 레이아웃에 배치
14
ListView divider dividerHeight
- 항목 사이의 구분선을 지정하며, 색상을 지정하거나 임의의 드로블 객체를 지정 - 코드에서는 setDivider 메서드를 사용하며 Drawable 객체를 인수로 전달 dividerHeight - 구분선의 높이를 지정
15
ListView – 단일 항목 추가 / 삭제 리스트 뷰에 항목을 넣거나 뺄 때는 어댑터와 연결된 원본을 편집
- 원본을 편집한 후 BaseAdapter의 메서드를 호출하여 참조하고 있는 원본 데이터가 변경되었음을 알려야 함 - 어댑터는 메서드가 호출될 때 원본을 다시 읽고 변경된 원본에 맞게 뷰를 생성하여 리스트 뷰로 재공급 리스트 뷰의 항목을 클릭하면 AdapterView.OnItemClickListener 인터페이스의 onItemClick 호출 - 항목 클릭 시점을 알고 싶다면 이 리스너를 구현한 후 리스트 뷰의 setOnItemClickListener 등록
16
ListView – 단일 항목 추가 / 삭제 ListTest3 (1 / 6)
17
ListView – 단일 항목 추가 / 삭제 ListTest3 (2 / 6)
18
ListView – 단일 항목 추가 / 삭제 ListTest3 (3 / 6)
19
ListView – 단일 항목 추가 / 삭제 ListTest3 (4 / 6)
20
ListView – 단일 항목 추가 / 삭제 ListTest3 (5 / 6)
21
ListView – 단일 항목 추가 / 삭제 ListTest3 (6 / 6)
22
ListView – 단일 항목 추가 / 삭제 실행결과
23
ListView – 복수 항목 삭제 ListTest4 (1 / 2)
24
ListView – 복수 항목 삭제 ListTest4 (2 / 2)
25
ListView – 복수 항목 삭제 실행결과
26
ListView – Custom Layout
ListView 기본 레이아웃 simple_list_item_1 커스텀 레이아웃을 작성하면 항목을 임의의 모양으로 출력할 수 있다.
27
ListView – Custom Layout
어댑터로 동작하려면 BaseAdapter로부터 상속을 받아 기본 기능을 물려받은 후 요구하는 추상 메서드를 재정의 - 이 메서드들은 BaseAdapter의 조상인 Adapter 또는 ListAdapter 인터페이스에 미리 정의되어 있음 어댑터는 원본과 리스트 뷰 사이의 중계 역할을 하며, 그러기 위해서는 대화의 수단이 필요 - 약속된 인터페이스가 대화 수단이며, 메서드들은 약속된 대로 요구하는 정보를 정확히 조사하여 넘겨주어야 함 - 리스트 뷰는 필요할 때마다 이 메서드들을 호출하여 출력에 필요한 정보를 얻음 - getCount : 어댑터에 몇 개의 항목이 있는지 조사, 리턴은 원본 배열의 개수 - getItem : position 위치의 항목을 조사, 배열의 position 번째 요소를 리턴 - getItemId : position 위치의 항목 ID를 리턴 (배열은 첨자 자체가 고유한 ID이므로 첨자를 그대로 리턴)
28
ListView – Custom Layout
getView : 항목 하나를 출력하기 위한 뷰를 생성하여 리턴하는, 항목 뷰를 생성하는 가장 핵심적인 메서드 - 리스트 뷰 : 각 항목 출력 시 어댑터의 getView 메서드를 호출하여 뷰를 요청, 리턴된 뷰를 리스트 뷰의 해당 위치에 배치. - 커스텀 뷰 : 이 메서드를 재정의하여 커스텀 레이아웃을 생성, 원본의 데이터를 대응되는 위젯에 출력 후 리턴. - position : 생성할 항목의 순서값 - parent : 생성되는 뷰의 부모 (즉, 리스트 뷰를 의미한다.) - convertView : 이전에 생성된 차일드 뷰로 최초 호출시에는 null이 전달, 두 번째 호출 시부터는 convertView에 이미 생성되어 있는 항목 뷰가 전달. 뷰를 준비한 후 position 인수 위치의 정보를 읽어 뷰의 위젯에 출력 객체의 형태에 맞게 만든 레이아웃이므로 어느 정보를 어느 위젯에 출력할 것인가는 통상 getView 메서드에서 하드 코딩 Icon Name 원본 항목 레이아웃
29
ListView – Custom Layout
ListTest5 (1 / 8)
30
ListView – Custom Layout
ListTest5 (2 / 8)
31
ListView – Custom Layout
ListTest5 (3 / 8)
32
ListView – Custom Layout
ListTest5 (4 / 8)
33
ListView – Custom Layout
ListTest5 (5 / 8)
34
ListView – Custom Layout
ListTest5 (6 / 8)
35
ListView – Custom Layout
ListTest5 (7 / 8)
36
ListView – Custom Layout
ListTest5 (8 / 8)
37
ListView – Custom Layout
초기화까지 완료된 convertView를 리턴 후 리스트 뷰는 항목을 해당 위치에 출력. - 두 번째 이후부터는 생성된 convertView가 인수로 전달되므로 속성만 전달 - 이 과정은 원본의 모든 데이터가 출력될 때까지 반복 항목 클래스와 어댑터 준비 후 메인에서 이들을 조합하여 리스트 뷰에 출력. - 리스트 뷰에 출력할 항목 배열을 초기화 - 커스텀 어댑터 객체를 생성 - 리스트 뷰의 setAdapter 메서드를 호출하여 리스트 뷰와 어댑터를 연결 리스트 뷰와 어댑터 통신 내부 동작. - 리스트 뷰는 어댑터의 getCount를 호출하여 원본 항목 개수를 조사, 각 항목에 대해 getView를 호출하여 뷰를 요청 - 어댑터는 미리 전달받은 리소스 ID로부터 레이아웃을 생성, 원본의 데이터를 대응되는 위젯에 미리 대입하여 리턴. 항목 클래스와 어댑터 준비 후 메인에서 이들을 조합하여 리스트 뷰에 출력
38
ListActivity 리스트 뷰는 다른 뷰를 포함할 수 있는 뷰 그룹이라 보통 액티비티 전체를 채움
리스트 뷰를 사용하는 액티비티는 레이아웃 구조가 거의 비슷하며 어댑터와 연결하고 선택 리스너를 처리하는 코드도 대동소이함 따라서 시스템 차원에서 리스트 뷰만으로 액티비티를 구성하는 ListActivity 클래스를 제공 - ListView를 내부 멤버로 가지며 액티비티 전체를 리스트 뷰가 가득 채움 - 별도의 레이아웃 작성이 필요 없으며 아래의 멤버로 내부의 리스트 뷰에 바로 접근 가능 - getListView : 리스트 액티비티의 멤버인 ListView 객체를 조사. - setListAdapter : 리스트 뷰와 어댑터를 연결. 리스트 뷰의 항목이 선택되면 onListItemClick 메서드가 호출되므로 별도의 리스너 등록이 필요없이 이 메서드를 재정의 리스트 뷰를 위한 객체와 리스너를 래핑한 클래스
39
OverScroll 안드로이드 2.3 버전부터 공식 지원
View 클래스에 오버 스크롤 방식을 지정하는 overScrollMode 속성이 추가됨 항목의 개수나 스크롤 모드에 따라 범위 끝에서의 동작이 달라짐 디폴트는 ifContentScrolls이며 항목 개수에 따라 오버 스크롤 여부를 결정 뷰의 속성이므로 XML 문서에 기록 가능하며 아래의 메서드로 실행 중 값 변경 또는 조사 가능
40
OverScroll ListView.setOverScrollMode(ListView.OVER_SCROLL_ALWAYS);
ListView.setOverScrollMode(ListView.OVER_SCROLL_NEVER); ListView.setOverScrollMode(ListView.OVER_SCROLL_IF_CONTENT_SCROLLS);
41
Spinner 목록을 표시하며 AdapterView의 후손으로, 리스트 뷰와 용도가 동일
항상 펼쳐진 상태인 리스트 뷰에 비해 스피너는 클릭할 때만 팝업으로 펼쳐짐 여러 가지 선택 사항 중 하나를 선택 받을 때만 사용 어댑터를 통해 데이터를 공급받으며, 어댑터 생성 방법은 리스트 뷰와 동일 항목 뷰를 표시하는 기본 레이아웃의 종류 - simple_spinner_item : 문자열만 표시 - simple_spinner_dropdown_item - 문자열과 라디오 버튼 표시 어댑터의 세 번째 인수로 레이아웃을 지정 스피너 자체에 라디오 버튼을 배치하는 것은 어울리지 않으므로 통상 simple_spinner_item을 지정
42
[ simple_spinner_item ] [ simple_spinner_dropdown_item ]
스피너 자체에 적용할 레이아웃과는 별도로 클릭 시 나타나는 팝업의 레이아웃을 아래의 메서드로 지정 인수로 스피너의 기본 레이아웃 두 가지 중 하나를 지정 [ simple_spinner_item ] [ simple_spinner_dropdown_item ]
43
Spinner 선택 사항에 대한 프롬프트 메시지를 팝업 상단에 따로 표시 가능
프롬프트는 아래의 메서드로 지정 가능하며, 리소스의 문자열 ID를 지정하거나 문자열 리터럴을 직접 지정 가능 XML에 prompt 속성으로 지정 가능하나 이때는 리소스만 지정할 수 있음 스피너에서 선택 변경 시 AdapterView.OnItemSelectedListener 인터페이스의 메서드가 호출 항목이 선택될 때, 모든 항목이 선택 해제될 때 각각 호출
44
Spinner 최초 실행시에 스피너의 첫 번째 항목이 선택되며 이때도 onItemSelected 메서드가 호출
- 메인 레이아웃에 텍스트 뷰와 스피너 하나 배치. - arrays.xml에 과일들이 문자열 리소스로 정의, 이 배열을 원본으로 사용
45
Spinner Spinner 예제 - 스피너 자체에 simple_spinner_item 레이아웃 지정.
드롭다운 팝업에 simple_spinner_dropdown_item 레이아웃 지정. - 이 두 조합이 가장 일반적 리스너에서 선택이 바뀔 때 사용자가 선택한 과일 이름을 토스트로 출력 MainActivity.java public class MainActivity extends Activity { ArrayAdapter<CharSequence> adspin; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner spin = (Spinner)findViewById(R.id.myspinner); spin.setPrompt("과일을 고르세요."); adspin = ArrayAdapter.createFromResource(this, R.array.fruits, android.R.layout.simple_spinner_item); adspin.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spin.setAdapter(adspin); spin.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View viiew, int position, long id) { Toast.makeText(MainActivity.this, adspin.getItem(position) + "는 맛있다.", Toast.LENGTH_SHORT).show(); } public void onNothingSelected(AdapterView<?> parent) {} });
46
Spinner 실행결과
Similar presentations