brunch

You can make anything
by writing

C.S.Lewis

by 장대희 May 11. 2015

Android Adapter

(안드로이드를)살려야한다

Android 앱에서 정말 많이 쓰는 class 인 Adapter 를 쪼끔 똑똑하게 써보자.


일단 레퍼런스

http://developer.android.com/reference/android/widget/Adapter.html

목록을 위해 Adapter는 많이 쓸 것이다.


동일한 뷰들의 목록이라면 별 무리 없이 view holder 를 이용해서 그냥 쓰면 된다.

이건 팁이라 할 것도 없이 많이 쓰는 형태. (요샌 recyclerview 도 쓰더만...)


그런데, 목록의 뷰 타입이 여러개일때는?

 getViewTypeCount() 와 getItemViewType(int position)을 적절히 이용하면 좋다.

이거 api level 1 부터 있었다. 대체 뭘 공부한건지...


브런치의 글뷰는 Listview 로 되어 있다.

긴~~ 글에 대한 메모리 절약과, 뷰의 속도를 위해서이다.

Adapter 선언부를 한번 옮겨본다.

public class PostViewListAdapter extends BaseAdapter {
    private static final int TYPE_COUNT              = 17;

    public static final int VIEW_TYPE_COVER_TEXT    = 1;
    public static final int VIEW_TYPE_COVER_IMAGE = 2;
    public static final int VIEW_TYPE_IMAGE = 3;
    public static final int VIEW_TYPE_TEXT = 4;
    ...

아이템 타입이 17개나 된다. ㅡ.ㅡ;;;

고백하건데, 예전에 나는...
Viewholder 한개 만들어 놓고, 거기에 모든 View를 몽창 우겨넣은 다음...

 타입별로 무식하게 View의 gone과 visible 을 난발했다. (창피하다... ㅠ.ㅠ)


이제 그렇게 하지 말자!!!


1. 일단 17개 타입이 존재한다고 Adapter 에 알려준다.

@Override
public int getViewTypeCount() {
        //return super.getViewTypeCount();
        return TYPE_COUNT;
}

2. position 별로 view의 Type을 가져오게 해준다.

@Override
public int getItemViewType(int position) {
        //return super.getItemViewType(position);
        final ArticleItem item = mArticleItemList.get(position); // 데이터
        if(PostConstants.POST_ITEM_TYPE_COVER_TEXT.equals(item.type)) {
                return VIEW_TYPE_COVER_TEXT;
        }
        else if(PostConstants.POST_ITEM_TYPE_COVER_IMAGE.equals(item.type)) {
                return VIEW_TYPE_COVER_IMAGE;
        }
        else if(PostConstants.POST_ITEM_TYPE_TEXT.equals(item.type)) {
                return VIEW_TYPE_TEXT;
        }
        else if (PostConstants.POST_ITEM_TYPE_IMAGE.equals(item.type)) {
                return VIEW_TYPE_IMAGE;
    }
    ...

3. getView 에 타입별로 View를 가져오게 변경한다.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        switch (getItemViewType(position)) {
            case VIEW_TYPE_COVER_TEXT:
                 return getCoverTextView(position, convertView, parent);
            case VIEW_TYPE_COVER_IMAGE:
                 return getCoverImageView(position, convertView, parent);
            case VIEW_TYPE_TEXT:
                return getTextView(position, convertView, parent);
    ...

4. 자 이제 위에서 정의한 method 를 각각의 ViewHolder 로 구현만 하면 끝 !

여기서부터는 뭐 그냥 하면 된다.

ViewHolder 레퍼런스 ("Android ViewHolder" 구글 검색 1번 글)

http://theeye.pe.kr/archives/1253



아래는 브런치 글뷰 캡쳐

커버타입 / 이미지타입 / 글본문 타입 으로 구성된 브런치 글뷰

단순히 ViewHolder의 갯수와 getVeiwXXXX만 늘어날 뿐, 그 안에서 visible과 gone 의 미칠듯한 복잡함은 사라진다.




p.s.

개발 code를 옮겨적기엔 좀 어렵지 아니한가 하는 느낌이 없지않아 존재하지만, 우리의 브런치가 맴바들의 노력으로 오픈을 드디어 오늘 했으므로 앞으로 더 잘 되리라 믿어 의심하지는 않는다면 우주의기운이 도울것입니다.   

keyword
매거진의 이전글 Android ImageSpan
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari