Android

[Android] ViewHolder 패턴

poppy 2020. 10. 29. 11:32
반응형

ViewHolder 패턴

다음링크의 ListViewAdpater의 getView()로 ViewHolder패턴을 어떻게 적용시킬 수 있는지 살펴보겠습니다

soohyun6879.tistory.com/30

 

- 각 뷰를 보관하는 Holder객체는 레이아웃의 태그 필드 안에 각 구성요소 뷰를 저장하므로 반복적인 조회없이 엑세스가 가능합니다

- setTag / getTag를 이용하고, 태그를 사용하면 findViewById를 하지 않아도 됩니다

- findViewById() 함수를 호출을 줄이기 위한 저장소 역할을 합니다

- 반복적으로 호출되는 메소드를 줄이기때문에 처리속도 향상에 많은 기여를 하고 스크롤이 부드러워집니다

- 위젯을 저장하기 위한 용도로 사용됩니다

 

public static class ViewHolder {
	TextView tx1;
	TextView tx2;
	ImageView img1;
}

ViewHolder라는 클래스를 만들어 변수를 정의해줍니다. 각 클래스 안에는 각 컴포넌트 View 원형을 정의합니다

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;
        final Context context = parent.getContext();
        ViewHolder holder;

        //ViewHolder 적용
        if (convertView == null) { // ConvertView가 없을 경우에만 View를 생성
            LayoutInflater li = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE));
            convertView = li.inflate(R.layout.listview_item, null);

            holder = new ViewHolder();
            holder.tx1 = (TextView) convertView.findViewById(R.id.textView1);
            holder.tx2 = (TextView) convertView.findViewById(R.id.textView2);
            holder.img1 = (ImageView) convertView.findViewById(R.id.imageView1);

            convertView.setTag(holder);
        } else { // 있는 경우에는 holder 객체에 설정되어 있는 것을 불러옴
            holder = (ViewHolder) convertView.getTag();
        }

        ListViewItem item = listViewItemList.get(position);
        
        //ViewHolder 적용
        holder.tx1.setText(item.getTitleStr());
        holder.tx2.setText(item.getDescStr());
        holder.img1.setImageDrawable(item.getIconDrawable());

        return convertView;
    }

ViewHolder는 Adpater 클래스의 getView 메소드 안에서 사용됩니다!

ConvertView가 없을 경우에 holder객체를 만들어서 뷰를 만들고 setTag를 통해 저장을 해줍니다

ConvertView가 있는 경우에는 아까 저장했던 holder객체에 설정되어 있는 것을 불러와 findViewById를 하지 않고도 바로 엑세스 할 수 있습니다!

반응형