woong's
Android ViewHolder 사용하기 본문
Android ViewHolder 사용하기
안녕하세요 . 오늘은 ViewHolder 사용법에 대해 말씀드리겠습니다 .
ViewHolder 를 사용하는 것은 뷰를 재활용 하기 위해서 사용합니다 .
특히 안드로이드 ListView 에서 많이 사용 되곤 합니다 .
Holder 를 통해 재활용을 하디 보니 ListView ViewItem 갯수 만큼 ViewHolder 가 생성 됩니다 .
그래서 고민하고 찾다 보니
http://www.kmshack.kr/346 의 블로그 분께서 유연성있는 ViewHolder 를 작성해주신것을 참고 하였습니다 .
위와 같이 작성을하면 하나의 View Holder 를 통해서 View 를 재활용 할 수 있어 간결화 할 수 있는것 같습니다 .
기존코드
기존 코드는 이와 같이 ListView 하나다 ViewHolder 가 필연적으로 생성해야 합니다 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | private static class ViewHolder { public final ImageView bananaView; public final TextView phoneView; public ViewHolder(ImageView bananaView, TextView phoneView) { this.bananaView = bananaView; this.phoneView = phoneView; } } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView bananaView; TextView phoneView; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.banana_phone, parent, false); bananaView = (ImageView) convertView.findViewById(R.id.banana); phoneView = (TextView) convertView.findViewById(R.id.phone); convertView.setTag(new ViewHolder(bananaView, phoneView)); } else { ViewHolder viewHolder = (ViewHolder) convertView.getTag(); bananaView = viewHolder.bananaView; phoneView = viewHolder.phoneView; } BananaPhone bananaPhone = getItem(position); phoneView.setText(bananaPhone.getPhone()); bananaView.setImageResource(bananaPhone.getBanana()); return convertView; } |
View Holder 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class ViewHolder { @SuppressWarnings("unchecked") public static <T extends View> T get(View view, int id) { SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); if (viewHolder == null) { viewHolder = new SparseArray<View>(); view.setTag(viewHolder); } View childView = viewHolder.get(id); if (childView == null) { childView = view.findViewById(id); viewHolder.put(id, childView); } return (T) childView; } } |
사용 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | @Override public View getView(int position, View convertView, ViewGroup parent) { if (viewArray != null && viewArray.get(position) != null) { convertView = viewArray.get(position).get(); if (convertView != null) return convertView; } if (convertView == null) { convertView = Inflater.inflate(layout, parent, false); } ImageView rankImage = ViewHolder.get(convertView ,R.id.img_rank); TextView txtTitle = ViewHolder.get(convertView ,R.id.txt_title); TextView txtPosition = ViewHolder.get(convertView ,R.id.txt_position); TextView txtSummonerName = ViewHolder.get(convertView ,R.id.txt_summonerName); // 이름별 랭크 이미지 삽입 int resource = convertView.getResources().getIdentifier ( "img_rank_"+boardList.get(position).getRank(), "drawable", context.getPackageName()); rankImage.setBackgroundResource(resource); txtTitle.setText(boardList.get(position).getTitle()); txtPosition.setText(boardList.get(position).getPosition()); txtSummonerName.setText(boardList.get(position).getSummonerName()); return convertView; } |
'Develop > Android' 카테고리의 다른 글
Android [Accessibility] Missing contentDescription attribute on image 해결 방법 (0) | 2016.02.14 |
---|---|
Android Intro 사용하기 (0) | 2016.02.14 |
Android Bundle 객체 전달 하기 (0) | 2016.02.14 |
Android runOnUiThread 사용하기 (0) | 2016.02.14 |
Android Handler 사용하기 (1) | 2016.02.14 |
Comments