꿈꾸는 엘프

 살아질 것인가. 살아갈 것인가.
이글루스 | 로그인
메뉴릿
카테고리
전체
Essay(내글)
Money(재테크)
Books(감상)
Books(추천도서)


WoodWork(목공 이야기)
Life Style(라이프스타일)


TokTokLab(모바일개발)
Transpedia(통번역)


I Want it(갖고 싶은 것들)
Like it (즐겨쓰는 모든것)
Go ! (즐겨찾기)
미분류
Profile

現톡톡랩 대표
前트랜스피디아 대표
前아침데이타시스템 과장(금융리스크 관리 컨설팅 및 개발)
前SK커뮤니케이션즈 메신저 개발팀 대리(NateOn3.7/4.0/Global Version개발)
前마켓포인트 신제품(전문가용실시간금융정보시스템) 개발 TF팀
박백민의 증권분석
Sugar Candy Mountain Lab

최근 등록된 덧글
좋은 글 감사합니다!!
by EE at 01/08
오랫동안 안드로이드 개발했지..
by 감사 at 05/08
좋은 글 잘보고 갑니다. 오래..
by ㄳㄳ at 05/07
똑같이 블로그를 하는 입장에..
by kwwon at 11/13
감사합니다. 정말 좋은자료네..
by 냐츠 at 06/26
포토로그

나의엘프의 포토로그
태그
안드로이드 전세 상태바사이즈 타운하우스 공간 응암1구역 사이즈 원목 응암2구역 주식 테라스가든 티크 스마트폰 부동산대책 보유세 펜션 어플개발 전세대책 집값 주택가격 메조트론 내이글루결산 투자설명회 누진세 아이콘사이즈 개발 부동산 쎌바이오텍 모바일
전체보기
최근 등록된 트랙백
garcinia cambogia fruit
by
garcinia cambogia
by
garcinia cambogia wikipe..
by
garcinia cambogia weight ..
by
http://helenmccrory.org/
by
buy pure garcinia cambo..
by
예비 창업자 & 소기업 사장이..
by 도서출판 부키
기본을 보면 미래가 보인다 2 -..
by 이글루스 블로거들의 살아있는..
왜 우리는 책을 읽어야 하는가? ..
by Fly, Hendrix, Fly
함정-으로 이어질 블로그링
by blogring.org
이전블로그
more...
이글루 파인더

rss

skin by 狂風
[안드로이드] 2.5 예제로 이해하는 ListView와 Adapter (1)

2.5 예제로 이해하는 ListView와 Adapter

 들어가는 말 : 여기까지 오는데 시간이 꽤나 걸렸습니다. 일을 하면서 짬짬이 만들기에는 어떤 예제를 구성할지 생각할 시간부터가 부족하더군요. 하지만, 예제로 이해해야 할 것들 중 1번이 레이아웃이라면, 좁은 화면 안에서의 모바일 어플 개발을 할 때 가장 많이 사용할 것이 ListView일 것입니다. 안드로이드의 ListView에는, 매우 편리하지만 또한 그 편리함 때문에 한계를 가지기도 하는 Adapter라는 개념이 있습니다. 자, 이제 두 번, 혹은 세 번에 걸쳐 ListView와 Adapter의 악어와 악어새 관계에 대해 예제로 파헤쳐 보겠습니다.

=====================================================================================================================

[그림27]

 그림 27과 같이 이전에 사용하던 레이아웃 main.xml 파일의 하단에 리스트 뷰를 배치한다. 레이아웃쪽에서는 특별히 할 일이 없다. 여기에서 데이터와 관련된 작업을 한다거나 하는 일은 거의 없다고 봐도 무방하다. 특별히 리스트뷰의 기능자체를 확장해서 새로운 클래스를 만들기 전에는, 몇가지 속성을 제외하고는 거의 똑같다고 생각하면 된다.

[그림28]
 예전과 마찬가지로, initView() 함수는 HelloWorld.java 의 onCreate에서 실행하고 있다. 지난 장에 잠시 본 결과 화면이 나오는 소스라고 하기엔 어딘가 허전하다. 하는 일이라고는 findViewById 를 이용해서 리스트뷰를 멤버 객체에 저장하고, _listView.setAdapter(new NoticeListAdapter(this)); 를 불러줬을 따름이다. 그렇다. 이 NoticeListAdapter라는 클래스가 화면에 뿌려지는 데이터를 담당한다. 뿐만 아니라, 리스트뷰의 행 내부의 레이아웃까지도 책임진다. 따라서, 리스트뷰에 대한 실질적인 코딩은 Adapter를 통해서 하게 되어 있음을 눈치챌 수 있다. 실제로, 기능이 꽤나 많은 거대한 Adapter 하나를 만들고 내부에 여러가지 함수들을 통해서, 화면 자체를 바꾸지 않고 전혀 다른 내용이 나오도록 코딩을 하기도 하고, 비슷한 상황이지만, 한 클래스가 너무 비대해지지 않게 하거나 모듈화를 위해서 Adapter를 여러 버전으로 쪼개서 setAdapter를 통해 바꿔주기만 하도록 코딩하기도 한다. 하지만, 대체로 내용이 바뀔 때 리스트뷰 외부의 레이아웃이나 내용도 바뀌기 때문에, 리스트뷰 하나당 어댑터 뷰 하나, 데이터 종류도 하나인 경우가 많다. 각설하고, 우리는, 책에 나온 시시콜콜한 이야기를 하려는게 아니라 똘똘한 예제 하나로 한걸음 성큼 다가서는 것이 목표이므로, 얼른 NoticeListAdapter 소스를 살펴보자.


[그림29]
 첫 줄부터 살펴보면, 
public class NoticeListView extends BaseAdapter
: BaseAdapter 라는 안드로이드 내부의 어댑터 기본 클래스가 존재하고, 그것을 상속받아서 필요한 함수들을 오버라이드하여 사용하면 됨을 알 수 있다.

private ArrayList<ChildData> _alData;
: ChildData로 이루어진 ArrayList 를 가진 것으로 보아, 리스트뷰에 행으로 쭉 뿌려지게 될 내용을 담는 자료구조일 것으로 생각된다. 바로 아래에 ChildData에 대한 정의가 있다. 내부를 보아하니, state, title, url, date로 구성되어 있는데, 상태라는 것이 있고 제목이 있고, 그 제목에 해당하는 내부 데이터가 있는 url이 있겠고, 작성된 날짜가 표시되어야 함을 알 수 있다. 쭉 내려와 보면, 생성자에서 이 자료구조 객체를 new 연산자로 생성함을 알 수 있다. 그리고, initData() 함수를 호출한다. 직감적으로, 이 함수 내부에서 뭔가 필요한 데이터 리스트를 만들어 낼 것으로 추측하고, 아래로 내려가 본다.

public boolean hasStableIds() : 내용이 비어 있으므로, 중요한 것이 아닌가보다. 그냥 넘어간다(사실 이 부분을 건드려야 할 내용이 생긴다면, 리스트뷰를 마음껏 주무르고 있다는 뜻이 된다. 평소엔 거의 건드릴 일이 없다.)

public Object getItem(int position) : 오버라이드된 함수인데, 리스트 뷰 내부에서도 사용하고, 어댑터 외부에서 데이터에 접근해야 할 때 사용된다. position에 해당하는 객체를 리턴해 주면 된다.

[그림30]
위 initData() 함수는, 오로지 이 예제를 위해서 만든 내용인데, 쉽게 그냥 바로 데이터를 넣어주는 예제를 위한 예제로 만들 수도 있었지만, 고민 끝에 실제로 현업에서 사용할 수 있는 유용한 스타일로 작성하였다. 주로, 데이터를 외부에서 넣어주고 어댑터에서는 데이터를 저장하고, 보여주는 용도로만 활용하는 경우가 많지만, 필자는 어댑터에 데이터를 조회하는 역할을 부여하여 코딩하기를 즐겨 한다. 여러가지 방법을 취해 봤지만, 이것이 가장 깔끔하다고 생각한다. 따라서, 실제로 웹서버로부터 xml데이터를 가져와서 파싱하여 화면에 뿌려주기 위해, CommonUtil.httpGetStream 이라는 이름으로 http 통신을 통해 InputStream 객체를 리턴하는 함수를 만들어 두고, 이것을 이용해 개인 웹서버에서 데이터를 가져온 후 잘 알려진 XML 파싱을 통해 한줄씩 필요한 데이터를 _alData 객체에 add 하고 있음을 알 수 있다. 참고로 하기 위해 아래 [그림31]에 noticelist.xml 내용을 첨부한다.

[그림31]
각각 제목, 날짜, URL을 가지고 있음을 알 수 있다. 그리고, 데이터를 다 넣고 나면 아래에 notifyDataSetChanged(); 라는 함수가 불리고 있는데, 이것을 불러줘야 실제로 변경된 데이터를 기준으로 화면에 ListView가 다시 그려지게 된다. 자, 이제 앞서 예고한대로 가장 중요한, 리스트뷰의 각 행이 실제로 화면에 뿌려지는 부분이 어떻게 구현되는지를 알아볼 차례다.

아쉽지만, 이 부분은 다음 시간을 통해 2.5 예제로 이해하는 ListView와 Adapter(2) 에서 알아보도록 하자.

===================================================================================================================
알기 쉽게, 그리고 실제 사용에 유용하도록 예제를 몇번이고 이렇게 저렇게 수정하느라 오랜 시간이 걸렸습니다. 너무 많은 내용을 한번에 담으려니까 너무 복잡해지고, 그렇다고 보여지는 부분만 설명하자니, 실제로 어떻게 사용하면 좋을지를 알려주기에 부족하고, 고민이 많이 되더군요. 모쪼록... 그래도 다른 강좌나 책보다는 실무적으로도 도움이 되길 바랍니다.
by 나의엘프 | 2010/11/17 09:02 | TokTokLab(모바일개발) | 트랙백 | 덧글(10)
트랙백 주소 : http://myelf.egloos.com/tb/2712799
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 김현성 at 2010/12/20 13:21
안녕하세요^^
친절하고 상세한 강좌, 너무 감사합니다^^
Commented by 나의엘프 at 2010/12/20 16:06
누군가에게 조금이라도 도움이 된다면, 그것으로 충분하지요...
Commented by 악마사랑 at 2010/12/28 16:00
와..정말 좋네요^^;
Commented by shakej at 2011/01/24 11:58
하루동안 삽질하던 부분이 이 곳에서 풀리기 시작하네요 ㅜㅜ 감사합니다^^
Commented by 나의엘프 at 2011/01/24 15:19
도움받는 분들이 있으니... 보람이 있습니다. 핵심 부분 연재까지 끝내고 일단락했지만...
삽질하면서 해결한 수많은 팁들... OS버그 피하기 등등.. 다시 연재해야 할텐데..
너무 바빠져서.. ^^ 모쪼록 많은 도움이 되었길 바랍니다.
Commented at 2011/01/24 18:27
비공개 덧글입니다.
Commented by shakej at 2011/01/24 22:56
보내주시는 게 그러시다면 엘프님, CommonUtil 이라는 메서드가 자꾸 없다고 나오는데..
구글에서 구글링해보니 임폴트를 시켜야 하는건가요?ㅜㅜ 저부분만 해결하면 될듯 한데 ㅜ
Commented by 나의엘프 at 2011/01/25 15:47
아.. 저건 그저 예제일 뿐입니다. 굳이 CommonUtil.httpGet 을 호출하라는 의미라기 보다는.. 저런식으로 http이든, 소켓이든, DB이든 데이터를 가져오라는 의미인데요.. ㅡㅡ; 저 CommonUtil은 제가 여기저기 쓰기 위해서 필요한 공용 기능들 구현해 놓은 클래스라.. 에러가 나겠지요.. initData 부분을 DB에서 데이터 읽어오는 방식으로 바꾸시는 것이 좋으리라 생각됩니다.
Commented by 나의엘프 at 2011/01/25 15:50
읽어 와서 _alData에 add만 쭉 해주시면 될테니까요... 바쁘시면 그냥 예제로 _alData.add 로 임의에 데이터들 쭉 넣도록 호출해 주도록 처리하시면 될 듯 합니다. 굳이 저 httpGet과 xml파싱을 사용하실 이유는 없습니다.
Commented by 푸르겔 at 2012/07/12 15:54
정말 한개 한개 글들이 가슴에 와닸습니다.
감사합니다.

:         :

:

비공개 덧글


◀ 이전 페이지 다음 페이지 ▶