(안드로이드를)살려야한다
일단 레퍼런스
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 을 난발했다. (창피하다... ㅠ.ㅠ)
이제 그렇게 하지 말자!!!
@Override
public int getViewTypeCount() {
//return super.getViewTypeCount();
return TYPE_COUNT;
}
@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;
}
...
@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);
...
여기서부터는 뭐 그냥 하면 된다.
ViewHolder 레퍼런스 ("Android ViewHolder" 구글 검색 1번 글)
http://theeye.pe.kr/archives/1253
아래는 브런치 글뷰 캡쳐
단순히 ViewHolder의 갯수와 getVeiwXXXX만 늘어날 뿐, 그 안에서 visible과 gone 의 미칠듯한 복잡함은 사라진다.
p.s.
개발 code를 옮겨적기엔 좀 어렵지 아니한가 하는 느낌이 없지않아 존재하지만, 우리의 브런치가 맴바들의 노력으로 오픈을 드디어 오늘 했으므로 앞으로 더 잘 되리라 믿어 의심하지는 않는다면 우주의기운이 도울것입니다.