woong's

Android ViewHolder 사용하기 본문

Develop/Android

Android ViewHolder 사용하기

dlsdnd345 2016. 2. 14. 00:28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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;
    }


Comments