Le_Penseur
[안드로이드 스튜디오] Ch6. 그리드뷰 & 리스트뷰 (GridView & ListView) 본문
[안드로이드 스튜디오] Ch6. 그리드뷰 & 리스트뷰 (GridView & ListView)
LePenseur 2019. 8. 22. 13:072019년 8월 22일 (목)
창업의 길로 가기 위한 두번째 걸음, [안드로이드 스튜디오]로 향해보자!
*질적으로 많이 부족한 글입니다. 지적 및 조언 환영합니다.
*이 글에선 "안드로이드 스튜디오"를 줄여서 "안스" 라고 표현합니다. 참고 바랍니다.
우선, 본인은 학원에서 'JAVA' 기초 수업을 선수강했다. 안드로이드 스튜디오를 배우기 위해선 피할 수 없는 언어이기 때문이다.
(물론 Kotlin 도 있지만, 대한민국에선 아직 JAVA의 파워가 어마어마 하다고..)
이번글에서는 그리드뷰와 리스트뷰에 대해서 배운다.
레이아웃 관련으로는 이번 글이 마지막이 될 것 같다. 내일 또는 다음주부터는 기능파트가 제대로 시작된다.(무섭다..하)
<차례>
1. 그리드뷰 (GridView) - 실습을 통한 배움(Learn by Practice)
2. 리스트뷰 (ListView)
1. 그리드뷰 (GridView) - 실습을 통한 배움 (Learn by Practice)
1.1 개념
우선 그리드뷰란 "격자형태로 뷰들을 정렬하기 위한 뷰"이다. (LinearLayout, FrameLayout과 매우 비슷하다.)
1.2 특징
a. 탑재된 뷰들을 '자'력으로 사용할 수 없다.
b. (그래서) 총 3개의 파일을 사용한다. (MainActivity / activity_main / ImageAdapter(new class))
1.3 디자인 (activity_main)
우선 디자인부터 정해야한다. 디자인이라고 해봐야 대단한건 없다. 이름이 '격자'인 만큼 그냥 격자를 어떻게 만들어 줄거냐는 말이다. 예를 들어 "가로 몇개, 세로 몇개" 이런식이다.
이 열과 행을 지정하는 방법은 2가지가 있다:
(a) android:numColumns="number"
android:numRow="number"
(b) android:columnCount="number"
android:rowCount="number"
***(a)는 학원에서 배웠고, (b)는 수많은 블로거 프로그래머들이 사용중인 방법이다.
기본적으로 LinearLayout을 '세로방향'의 부모 레아웃으로 두고, 그리드뷰를 행의 갯수와 함께 그 안에 설정한다.
위의 사진같은 경우 가장 상위 부모는 Constraint이다. 참고하시길.
(가장 상위가 Constraint더라도, 다음 부모가 Linear 라면 그 안의 child는 상관이 없는 듯 하다.)
1.4 자바 클래스 생성 (new JAVA Class)
위에서 설명했듯, 그리드뷰(레이아웃)는 탑재된 뷰들을 자력으로 사용할 수 없다. 그러므로, 클래스를 새로 생성해준후, 기능을 담당하는 MainActivity를 통해 뷰들을 실행 해주는 식이다. (...드디어 어려워지기 시작한다)
(a) 클래스를 생성해보자.
클래스는 java파일안에 있는 com.example.mygridlayout(android) 이라는 곳에 만들어준다. 그 이유는 정확히 모르겠지만,
밑의 나머지 2개 파일들은 test 시도 와 연관이 있는것같다.
이렇게 자바 클래스를 하나 생성해주자.
아래를 보면 필자가 방금 생성한 자바 클래스가 BaseAdapter를 상속(extends) 한다고 적었다.
또, Context 를 통해 context라는 '화면' 변수를 생성했다. (밑에서 나오겠지만 변수선언은 변수선언일뿐,아직 실행은 안되었다.)
그.런.데 잠깐
BaseAdapter가.... 뭐지?
"public abstract class BaseAdapter extends Object implements ListAdapter, SpinnerAdapter"https://developer.android.com/reference/android/widget/BaseAdapter
즉, 저렇게 BaseAdapter를 상속하게 되면, ListAdapter와 SpinnerAdapter를 실행할 수 있게 된다는것이다.
그럼, ListAdapter와 SpinnerAdapter는 뭔데?
아니 그보다 Adapter란 무엇인가?
Adapter: 데이터 테이블을 목록 형태로 보여주기 위해 사용되는 것으로 데이터를 다양한 형식의 리스트 형식으로 보여주기 위해서 데이터와 리스트 뷰 사이에 존재하는 객체입니다. 즉, 간단히 말해 데이터와 뷰 사이의 통신을 위한 다리 역할을 합니다.
출처:http://www.gisdeveloper.co.kr/?p=1268
아하! 데이터(클래스 및 객체)와 뷰(디자인)사이의 통신 역할을 한다는게 핵심이구나!
그럼 다시 돌아와보자. BaseAdapter를 상속하게 되면, ListAdapter와 SpinnerAdapter를 실행할 수 있게 된다고 했다.
즉, 두개의 다른 종류의 데이터와 뷰사이의 통신역할을 해주는 멀티 다리 역할의 메서드라는 것을 알 수 있다.
근데 또 하나의 의문점, 나의 클래스, 즉 GridView를 위한 클래스가 왜 ListAdapter 또는 SpinnerAdapter가 필요할까?
그 해답은 안드로이드 공식 API에 나와 있었다.
A view that shows items in two-dimensional scrolling grid. The items in the grid come from the ListAdapter associated with this view.
출처: http://developer.android.com/reference/android/widget/GridView.html
위 레퍼런스는 GridView에 대한 설명이다. 필요한 부분만 요약하자면, GridView내 아이템들은 ListAdapter에서 온다는 것 이다.
음.. 상식적으로 생각해도 그리드 라는 것 자체가 리스트적인 요소가 주체니까, 어찌보면 당연한 이야기인 것 같다.
결론적으로 GirdView와 ListAdapter는 뗄레야 뗄수 없는 운명인 것 이다. 그리고 이를 위해서 BaseAdapter를 사용하는것 뿐이다.
(b) 배열을 통해 효율적으로 사용할 데이터를 정리해보자.
저번 시간에도 배열을 사용했다. 앞으로도 매우 자주 사용하지 싶다.
미리 총 20개의 사진을 res.drawable파일에 넣어 두었다. (자세한 방법은 전글을 참고하시길)
그리고 Integer, 즉 정수형 배열을 img라는 이름으로 객체 생성 해주어 저장한 모든 사진들을 넣어두었다.
이제부턴 나의 모든 사진들이 저 img라는 객체의 이름과 함께 i(순서)로 호출될 것 이다!
굳이 하나하나의 파일들을 호출할 필요 없어 정말 편리하다.
(c) 화면을 출력해보자
내가 생성한 (ListAdpater를 상속받고 있는) 클래스를 호출해서, 화면을 호출한다.
응? 근데 위에서 이미 context를 만들었는데 또 만들어?
헷갈리면 안된다. 위의 Context context(또는 this.context) 는 화면을 출력하는 Context 메서드를 받은 context 객체일 뿐, 아직 implement(실행)는 되지 않았다는 것 이다.
따라서 ImageAdapter 클래스에 의해 화면이 출력되도록 하는 것 이다.
(d) Count, item, ItemId, View 를 가져오자
정말 그리드뷰는 많은걸 요구한다. 하지만 이 모든것들이 필수라고 한다.
우선 get 이란 가져온다는 뜻이다.
그걸 유념하고 밑의 설명을 보자.
getCount: 표현하고자 하는 아이템 갯수를 설정해주는 메서드
getitem: 원하는 위치의 아이템을 반환해주는 메서드
getitemId: 아이템의 아이디를 설정해주는 메서드 (배열로 설정했기에, 이 로직은 실질적으로는 필요 없다.)
getView: 실제 아이템을 화면에 배치할 때 호출되는 메서드. (context와는 다른개념이다. context가 종이라면 getView는 그위의 그림 같은 개념이다)
(d.a) getCount
getCount라는 메서드를 선언하고 {} 중괄호 안에서 기능을 설정해주었다.
{return img.length} : {이보게 컴퓨터 양반, img변수 속 모든 사진들을 리턴해주시오}
쯤 되겠다.
(d.a) getItem
getItem 메서드를 선언해주고,
(int position) : 몇번째 위치의 사진을 반환 하겠는지 정해달라는 것이다.
return img[position]; : 다 리턴 할거라서 그냥 position이라고 둔다.
(d.a) getItemId
getItemId 메서드를 선언한다.
(int i) : 몇번째, 또는 어떤 아이디의 데이터를 가져올것인지 설정해달라는 것 이다.
Exception e = new Exception() : 예외 (오류) e 라는 내부 클래스를 만들었다.
return 0; : 그 어떤 아이디도 리턴할게 없다는 강경한 입장이다.
(d.a) getView
getView라는 메서드를 선언한다. 이 메서드를 선언하는 방법은 간단하다. [마우스 오른쪽 클릭 -> generator -> Override -> getView]
() 소괄호 속을 보면 알겠지만 뷰란 뷰는 모두 나와버린다.
이 메서드의 핵심은 가장 밑의 return부분이다. imageView를 반환한다는 것이 가장 중요하다.
1.5 기능 (MainActivity)
기능 부분은 상대적으로 간단한 편 이다.
GridView 이름을 gridView로 변수 선언해주고 (기존 디자인파트의 (동일한 이름의) 아이디와는 다른 차원이다)
기존 디자인 부분에서 생성한 그리드뷰의 아이디 gridView를 호출하여 방금 선언한 그 변수에 고대로 넣어준다.
그러한 디자인 부분의 아이디가 들어가 있는 gridView라는 변수에서 여태 만든 ImageAdapter를 초기화 해준다 (참고로, 프로그래밍에서 초기화란 출력준비단계를 의미한다).
--> 변수이름.setAdapter(new ImageAdapter(context: this));
2. 리스트뷰 (ListView)
리스트뷰는 상대적으로 간단하고, 이전글에서 설명한 적이 있어, 최대한 중요한 요소만 말하려고 한다.
우선 리스트뷰란 리스트 형태로 뷰들을 정렬하기 위한 뷰 이다. 이 리스트안에 아이템을 추가시키는 방법은 2가지가 있다.
2.1 resource 파일 이용하기
이런식으로 아이템을 string-array속에 추가하는 방식인데
이에 대한 자세한 설명은 밑의 링크를 참고하시라. 본인의 예제와 함께 자세히 서술하였다.
https://lepenseur-blog.tistory.com/8
안드로이드 기초 #5 - 위젯과 실습 (Widget & Practice)
2019년 8월 21일 (수) 창업의 길로 가기 위한 두번째 걸음, [안드로이드 스튜디오]로 향해보자! *질적으로 많이 부족한 글입니다. 지적 및 조언 환영합니다. *이 글에선 "안드로이드 스튜디오"를 줄여서 "안스" 라..
lepenseur-blog.tistory.com
2.2 JAVA 이용하기
다음으로는 JAVA를 이용한 아이템 추가 방법이다.
당연하게도 효율을 중요시하는 JAVA는 배열을 기본적으로 사용하게 되며 위 Adapter를 이용한것과 비슷하게
이번엔 ArrayAdapter 메서드 를 이용한다.
'개인(Personal) > 안드로이드 (Andorid Studio)' 카테고리의 다른 글
[안드로이드 스튜디오] Ch8. 리스트뷰 이벤트처리 (ListView Event Handling (0) | 2019.08.25 |
---|---|
[안드로이드 스튜디오] Ch7. 이벤트 처리(Event Handling) (0) | 2019.08.23 |
[안드로이드 스튜디오] Ch5. 위젯과 실습 (Widget & Practice) (0) | 2019.08.21 |
[안드로이드 스튜디오] Ch4. 프레임레이아웃과 기능의 조합 (FrameLayout & Function Mixture) (0) | 2019.08.20 |
[안드로이드 스튜디오] Ch3. 테이블레이아웃 & 프레임레이아웃(TableLayout & FrameLayout) (1) | 2019.08.18 |