본문 바로가기

책 요약하기/코틀린을 활용한 안드로이드 프로그래밍

#11. 어댑터뷰 2021-02-18

- 요약 -

 

1. 어댑터뷰의 계층도는 다음과 같습니다.

java.lang.Object
	android.view.View
    	android.widget.viewGroup
        	android.widget.AdapterView
            	android.widget.AbsListView
                	android.widget.GridView
                    android.widget.ListView
                    	android.widget.ExpandableListView
                android.widget.AbsSpinner
                	android.widget.Spinner
                    android.widget.Gallery

 

2. 리스트뷰를 만드는 형식은 다음과 같습니다.

  1. 리스트뷰에 나열할 내용을 미리 String 배열로 만들어 놓습니다.
  2. 리스트뷰 변수를 생성하고 XML의 <ListView>에 대응시킵니다.
  3. ArrayAdapter<String>형의 변수를 선언하고, 리스트뷰의 모양과 내용을 1번의 배열로 채웁니다.
  4. 3번에서 생성한 어레이어댑터를 2번의 리스트뷰 변수에 적용합니다.
  5. 리스트뷰의 항목을 클릭했을 때 동작하는 람다식을 정의합니다.

 

3. 리스트뷰의 모양은 기본적으로 simple_list_item_1을 사용합니다. simple_list_item_single_choice를 사용하면 라디오버튼이 되고, simple_list_item_multiple_choice를 사용하면 체크박스가 됩니다.

 

4. 리스트뷰의 항목을 동적으로 추가, 삭제하려면 ArrayList<T>를 정의한 후 add()와 removeAt()메소드를 사용합니다.

 

5. 그리드뷰는 사진이나 그림을 격자 모양으로 배치해줍니다. 버튼, 텍스트 등을 배치할 수도 있지만 주로 사진이나 그림을 배치합니다.

 

6. 갤러리는 사진이나 이미지를 배치하고 좌우로 스크롤하여 볼 수 있게 해줍니다.

 

7. 스피너는 PC의 드롭다운 박스와 비슷한 기능을 하므로 화면이 작은 스마트폰에서 여러 개 중 하나를 선택할 수 있도록 확장하는 용도로 쓰입니다.

 

- 연습문제 -

 

1. AdapterView 클래스의 하위 클래스 10개를 나열하시오.

< Direct Subclasses >

Class Name Class Content
AbsListView 가상화 된 리스트 구현을 위한 기본 클래스
AbsSpinner 스피너 위젯 추상 클래스
AdaterViewAnimator 뷰 사이의 스위칭시 애니메이션 기본 클래스

 

< Indirect Subclasses >

Class Name Class Content
AdapterViewFlipper ViewAnimator클래스 보다 간단한 클래스
Gallery ViewPager와 HorizontalScrollView를 포함한 수평 스크롤링(API 16부터는 추천 x)
GridView 그리드 형식의 뷰 (차원 스크롤링)
ListView 리스트 형식의 뷰 (수직 스크롤링)
Spinner PC의 드롭박스 다운같은 기능
StackView  

 

2. 리스트뷰의 모양을 표현하는 클래스 상수에는 android.R.layout.simple_list_item_1 외에 무엇이 있는지 조사하시오.

Const Class Class Content
simple_list_item_2 리스트 형태의 다른 버전
simple_list_item_activated_1 simple_list_item_1에서 체크 시 백그라운드 상태를 바꿀 수 있음.
simple_list_item_activated_2 simple_list_item_2에서 체크 시 백그라운드 상태를 바꿀 수 있음.
simple_list_item_checked 체크박스 형태의 리스트
simple_list_item_multiple_choice 다중 체크가 가능한 체크박스 형태의 리스트
simple_list_item_single_choice 라디오버튼 형태의 리스트
simple_selectable_list_item 텍스트와 (싱글, 멀티)아이템 선택 가능한 리스트

 

3. [예제11-8]에서 BaseAdapter 클래스를 상속받을 때 완성되는 getCount(), getItem() 등의 추상 메소드는 어떤 인터페이스에 속하는가?

답 : From interface android.widget.Adapter 

 

4. ( 1 )는 사진이나 이미지를 배치하고 좌우로 스크롤하여 볼 수 있게 해주며, ( 2 )는 PC의 드롭다운 박스와 비슷한 기능을 한다.

답 : 

( 1 ) -> Gallery

( 2 ) -> Spinner

 

5. 10장에서 작성했던 [실습10-2] 명화 선호도 투표 앱의 첫 화면을 그리드뷰로 변경하여 프로젝트를 작성하시오.

[activity_main.xml]

 

[MainActivity.kt]

(★ MyGridAdapter 클래스변수를 그리드 뷰에 적용합니다.)

(★ 1. 이미지뷰 변수를 생성하여 해당 그리드 뷰 위치(position: p0 파라미터)에 맞게 이미지를 넣어줍니다. 그리고 이미지를 클릭하면 투표수를 증가시키고 해당 메시지를 토스트로 출력합니다)

(★ 2. 총 이미지 갯수(이미지 아이디 갯수와 동일)의 크기를 반환합니다.)

(★ 참고로 그리드 뷰에서 자주 쓰이는 추상메소드는 getCount와 getView입니다.)

 

6. [직접 풀어보기 11-3]을 개선하여 영화 포스트가 이미지뷰가 아닌 9장 [예제 9-6]의 myGraphicView에 출력되도록 프로젝트를 작성하시오. 그리고 컨텍스트 메뉴로 영화 포스터가 [그림9-3]처럼 기하학적 변환이 되게 하시오.

 

 

[main_activity.xml]

(★ MyGraphicView 클래스를 리니어레이아웃에 뷰를 추가하기 위해 xml파일에 작성합니다.)

 

[MainActivity.kt]

(★ 1. 전역변수로 회전, 확대 or 축소, 기울기 증가 or 감소, 스피너 선택된 이미지 인덱스 변수(posterNum), 각 포스터 별 ID 배열변수, MyGraphicView 클래스 변수를 선언합니다.)

(★ 2. 비어있는 리니어 레이아웃(pictureLayout)에 MyGraphicView(graphicview)로 뷰를 추가하고, 해당 레이아웃(pictureLayout)에 컨텍스트 메뉴를 추가합니다. 또한 스피너 아이템 선택 리스너에는 선택된 이미지 인텍스 변수(posterNum = p2)를 설정하여 onDraw메소드가 호출 될 때마다 인덱스(posterNum)에 해당하는 이미지를 보여주도록 합니다.)

(★ 3. 컨텍스트 메뉴를 추가하고 menu!!.add(...) 컨텍스트 아이템 선택 메소드를 메뉴 아이템 ID 별로 작성합니다. 컨텍스트 메뉴를 클릭 할 때마다 상단의 전역변수 값을 바꾸고 invalidate()메소드를 호출 할 때마다 onDraw()메소드가 호출되는데 이때 변화된 전역변수의 값이 이미지를 다르게(회전, 기울이기, 확대 등) 보여줍니다.)

(★ 4. MyGraphicView 화면에 보여질 이미지를 작성합니다.)

 

수고하셨습니다. 이상 마치겠습니다 :)