꿈꾸는 엘프

 살아질 것인가. 살아갈 것인가.
이글루스 | 로그인
메뉴릿
카테고리
전체
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
포토로그

나의엘프의 포토로그
태그
사이즈 부동산대책 누진세 어플개발 응암2구역 안드로이드 개발 원목 공간 메조트론 전세대책 응암1구역 내이글루결산 보유세 집값 펜션 티크 주식 모바일 스마트폰 쎌바이오텍 아이콘사이즈 부동산 상태바사이즈 타운하우스 전세 테라스가든 투자설명회 주택가격
전체보기
최근 등록된 트랙백
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 (2)

2.5 예제로 이해하는 ListView와 Adapter (2)

들어가는 말 : 바로 올리려고 했습니다만, 바쁜 일이 또 생기면서 늦어졌습니다. 하지만, 바쁘다고 언제까지 미룰수도 없고, 쓰다 만 챕터는 얼른 써야 겠습니다. ^^ListView와 Adapter의 악어와 악어새 관계, 오늘로써 거의 모든게 파헤쳐 진다고 할 수 있습니다.

=====================================================================================================================
[그림32]
지난 시간에 올렸던 소스에 이어, [그림32]와 같이, ListAdapter에서 가장 중요한 부분에 해당되는 getView()함수를 분석해 보겠습니다. 개념적으로 설명하자면, 이 getView는 리스트 뷰의 각 행별 레이아웃을 정의하고 원하는 데이터를 뿌리는 일련의 과정을 실행하는 함수라고 할 수 있다. 이제 getView 소스로 들어가 보자.

    public View getView(int position, View convertView, ViewGroup parent) {
    - position : 행의 index를 의미
    - convertView : 행 전체를 나타내는 뷰를 의미한다.
    - parent : 어댑터를 가지고 있는 부모 뷰를 의미한다. 여기서는 ListView가 되겠다.

        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater)HelloWorld.getInstance().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.noticeitem, parent, false);
            ViewHolder holder = new ViewHolder();
            holder.title = (TextView)convertView.findViewById(R.id.notice_title);
            holder.date = (TextView)convertView.findViewById(R.id.notice_date);
            holder.body = (TextView)convertView.findViewById(R.id.notice_content);
            convertView.setTag(holder);
        }
    - convertView에 null이 넘어오면, LayoutInflater를 이용해서 noticeitem이라는 layout을 전개한다.
    - ViewHolder 객체를 생성해서 convertView 내부의 title, date, content를 의미하는 layout내부 객체를 저장하고, convertView에 setTag 함수를 통해서 ViewHolder를 convertView 에 저장시킨다.
    - 여기서, convertView == null 을 체크하는 것은, 매번 생성할 수도 있지만, 이 getView함수는 해당 행이 화면에 표시되어야 할 때(예:스크롤될 때)마다 호출되기 때문에, 매번 화면을 생성하는 것은 속도에도 영향을 미치고, 메모리 관리에도 좋지 못하기 때문이다.

 별거 아니지만, 여기까지가 getView의 핵심 소스라고 할 수 있다. 그 아랫줄에는, 멤버로 가지고 있는 리스트형 데이터 객체 _alData에 있는 데이터 중 position 번째에 해당하는 title, date, content 를 holder.title, holder.date, holder.body에 각각 setText 시키고, 아코디언처럼 펼쳐지게 하기 위해서 OnClick 시마다 펼쳐지면서 해당행에 해당하는 URL을 통해 httpGet으로 content를 가져와서 holder.body에 setText시키고, 다시 한번 누르면 holder.body를 보이지 않게 해서 닫히게 해 놓는 것이 전부이다. 여기에서, 아코디언이 반쯤 펼쳐지면서 loading되는 글자나 그림이 나왔다가 httpGet이 완료되면 전체가 나오도록 하려면, loading이미지를 넣어주고 Thread를 사용하여 데이터를 요청하고, 다 가져오면 setText하도록 한다거나, 그 중간형태를 취하려면 setText("loading") 을 한번 하고, httpGet을 호출한 후 다시 한번 setText(result)를 한다거나 하는 등 여러가지 방법을 생각할 수 있다. 하지만, 예제로서는 이만큼도 훌륭하다고 본다. 나머지는 직접 여러가지를 궁리하여 개발해 보기 바란다.

그런데, 여기서 한가지 의문점이 든다. (필자는 실제로 이 문제때문에 하루를 홀랑 날려버린 경험이 있다.) 위 if문, 즉, convertView에 null 이 넘어 왔을 때 생성하고 데이터도 한번 넣어두면 될 것인데, setText는 매번 하고 있는 것을 알 수 있다. 이 이야기는, n번째 행이 처음 보일 때 Layout은 한번만 생성해 두지만, 내부에 데이터는 스크롤이 되어 getView가 불리울 때마다 setText를 통해서 데이터를 넣는 것이다. 그런데, 데이터를 넣는 작업도 if문 안에서 한번만 하면 훨씬 효율적이지 않을까? 라는 생각을 하기 쉽상이다. 하지만, 곰곰히 생각해 보자. 그렇게 되어 있다는 것은 거꾸로 말하면 1만개의 행이 있으면 내부적으로 1만개의 View가 생성된다는 것과 같으니, 이것은 정말 비효율적인 것이다. 그래서, 안드로이드에서는 내부적으로 Adapter의 convertView를 특정 로직에 의해 적당한 크기의 Pool형태로 가지고 있으면서, 이전에 생성되었으나, 현재는 보여주지 않는 행에서 기 생성된 convertView를 재사용하는 형태를 취하고 있다. 따라서, 그냥 아무 생각없이, 재활용한답시고, if문 안에 데이터를 넣어두고 철썩같이 믿으면, 위아래로 스크롤 하다보면 1번째 행의 내용이 10번째 행에 다시 나타나는 어처구니 없는(?) 현상에 직면하게 되고, 머릿속은 하얗게 되며, 안드로이드를 원망하는 사태가 발생할 수 있다. 그래서, 무턱대고 용감하게 깊이 생각하지 않고 대충 따라하게 되면 마음과 몸이 고생하게 되는 것이다. ^^;;; 다른 분들은 이런 경험을 하지 않기를 바랄 뿐이다. 필자의 경우, 그런 내용으로 고생한 것이 아니라, 뷰에 데이터를 연결할 수 있는 setTag함수를 통해서 데이터를 저장해 두고, 그것이 다음에 다시 쓸 때에도 살아있어주기를 기대했다. 그러나, View는 풀링되면서 tag는 따로 저장해 주는 센스를 안드로이드는 발휘해주지 않았던 것이다.(사실, 당연히 그럴리가 없다.) 분명히 10번째 행에 필요한 데이터를 setTag 해 두었는데, getTag를 해 보니 엉뚱한 데이터가 나오는 것이 아닌가? 모쪼록 여러분들은 Adapter의 getView를 제대로 이해하여 이런 경험을 하지 않기를 바라면서, 리스트뷰와 어댑터의 관계에 대한 이야기는 .. 여기서 끝~

=====================================================================================================================
휴... 요즘처럼 일이 넘쳐나는 경우는 IT사업가에게 흔치 않은 기회인 것은 분명합니다. 이 시기에 어떻게 하느냐가 앞으로 10년을 좌지우지 합니다. 하지만, 자기가 가진 기술에 자부심을 갖는 건 좋지만, 쫌생이처럼 별 것도 아닌 기술을 가지고 나는 아는 것을 남은 모르길 바라는 마음을 가지고는 큰 일을 할 수 없다고 생각합니다. 제가 쓰고 있는 이 강좌들은 그런 축에도 끼지 않는 보잘것 없는 일이지만, 내가 잘 몰라 고생했던 길을 다른 사람들은 겪지 않길 바라는 마음... 그 마음들이 모여야 세상이 발전하는게 아닐까요? 작은 도움이라도 되었다면, 이 글을 읽는 많은 분들이 자신의 경험과 생각들을 공유하길 바랍니다.

모두들.. 좋은 연말 보내세요~ 올해에는 작년보다 발전했길 바라고, 내년에는 올해보다 더 큰 발전을 이루시길 바랍니다.
연말까지는 간단한 팁이 아닌 공식 추가 강좌는 힘들지 않을까 생각됩니다. 미리 해피 뉴이어~
by 나의엘프 | 2010/12/09 15:02 | TokTokLab(모바일개발) | 트랙백 | 핑백(1) | 덧글(19)
트랙백 주소 : http://myelf.egloos.com/tb/2723978
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at 꿈꾸는 엘프 : 2010년 내.. at 2011/01/02 15:58

... DTI 원상복귀해야"(종합... IT (7회) | [안드로이드] 2.5 예제로 이해하는 Lis... 패션&뷰티 (2회) | 2, 30대 ... more

Commented by 힘찬아빠 at 2010/12/09 15:32
훌륭하신 생각이십니다... 저도 일조하렵니다 ^-^
Commented by 나의엘프 at 2010/12/09 15:59
이와 같은 말씀 한마디가 힘이 됩니다. ^^;;; 블로그를 오랜기간 꾸준히 관리해 오고 계시는군요. 멋지십니다.
Commented by 김현성 at 2010/12/20 13:27
경험과 생각의 공유에 대한 부분.. 깊이 공감합니다. 저도 실천할 수 있도록 노력해야겠네요. ^^
감사합니다^^
Commented by 솔로독백 at 2010/12/28 16:52
관련 레퍼런스가 있겠지라는 생각으로... 10시간여를 찾아본 결과, 아무것도 찾지 못하고,
삽질을 하다... 그냥 내가 뷰를 만들어쓰자라는 생각을 할려던 찰나에.......

여기까지 오게됐습니다.

감사합니다.
완전 사랑합니다......
Commented at 2011/01/24 23:21
비공개 덧글입니다.
Commented by neul at 2011/04/01 14:22
"1번째 행의 내용이 10번째 행에 다시 나타나는 어처구니 없는(?) 현상에 직면하게 되고"

그 현상에 직면해서 개 고생한 1인입니다...... 명쾌한 답변 정말 감사합니다 ㅜ!!
Commented by 이승철 at 2011/07/04 14:41
자료도 훌륭하지만 쓰신글에서 인성과 마인드도 배워갑니다.
Commented by 나의엘프 at 2011/07/04 15:24
감사합니다. 그저 10년 이상 이 일을 하고 있는 한 개발자이자 IT사업가의 작은 생각일 뿐입니다.
Commented by 농농 at 2011/07/20 17:00
아~~ 이미지가 적어서 눈이 아파요 @.@ 좀더 고화질로 올려주실 순 없는것인지요... 쩝 ^^;;
Commented by 나의엘프 at 2011/07/20 17:00
음.. 이미지 클릭하세요! ^^
Commented by 한성준 at 2011/12/09 15:33
자료도 겨우찾던 자료라 반가웠는데 게다가 경험에서 나오는 조언까지 해주시니

댓글을 안달수가 없군요 ㅎ

감사합니다 좋은 정보 알아 갑니다.
Commented by 박양제 at 2012/11/28 22:44
감사합니다.
Commented by 박충희 at 2013/04/01 11:48
자세한 강좌 너무 감사합니다. 삽질하신 경험에서 나오는 조언 덕분에 저역시 삽질하던 3일을 보상받았습니다. 자세한 설명 및 현상 파악에 너무 많은 도움이 되었습니다. 감사합니다.
Commented by 나자 at 2013/06/05 13:43
깊이있는 강좌.. 너무 감사드립니다.
Commented by IT at 2013/07/05 13:13
이야.. google 검색으로 getView에대해 찾다 들렀는데, 설명뿐만아니라 특히나 마지막에 쓴 글 보고 댓글을 안 달 수가 없었네요. 저도 일조하겠습니다.
Commented by 유민호 at 2013/10/26 11:23
깊이있는 말씀 감사드립니다. 댓글을 안달수가없겠네요.
저의 댓글이 글쓴이님에게도 힘이되시길 바랍니다.
Commented by kwwon at 2014/11/13 22:14
똑같이 블로그를 하는 입장에서는 잘봤다는 하나의 답글도 얼마나 힘이 되는지 알기에
그냥 지나칠수 없어 답글을 남깁니다.
다른분들이 말했다시피 제공하신 정보도 훌륭하시지만 올릴때 공유하고자 하는 마음이 너무 아름다우셔서 댓글을 안남길수가 없었습니다 잘봤습니다 감사해요
Commented by ㄳㄳ at 2015/05/07 13:10
좋은 글 잘보고 갑니다.
오래 전에 쓰신 글인데도 도움이 많이 되네요.
Commented by EE at 2016/01/08 10:36
좋은 글 감사합니다!!

:         :

:

비공개 덧글


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