본문 바로가기

PROGRAMING/Android

[widget]android.widget.ListView [3] convertView 사용과 Holder Pattern

getView를 사용하여 임의의 View를 구현할때 

convertView 와 Holder pattern을 사용하면 성능을 향상 시킬 수 있다.


1. 안드로이드는 listview의 Item을 재활용하기 때문에 convertView가 null 인지 확인하는 구문을 넣으면

반복적으로 inflate하는 로직을 줄일수 있어 성능을 향상 시킬 수 있다.

class CustomArrayAdapter extends ArrayAdapter<String>{

public CustomArrayAdapter(Context context) {

super(context,0);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder viewHolder=null;

if(null==convertView) {

viewHolder = new ViewHolder();

convertView = getLayoutInflater().inflate(R.layout.custom_list_item, null);

viewHolder.tv = (TextView)convertView.findViewById(R.id.text1);

convertView.setTag(viewHolder);

} else {

viewHolder = (ViewHolder)convertView.getTag();

}

String value = getItem(position);

viewHolder.tv.setText(value);

return convertView;

}

}

class ViewHolder {

public TextView tv;

}


2. Holder pattern을 사용하여 findViewById 호출을 줄여 성능을 향상 시킬수 있다.

findViewById는  Holder pattern보다  자원을 많이 소모하는 함수로 알려져있다.


class CustomArrayAdapter extends ArrayAdapter<String>{

public CustomArrayAdapter(Context context) {

super(context,0);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder viewHolder=null;

if(null==convertView) {

viewHolder = new ViewHolder();

convertView = getLayoutInflater().inflate(R.layout.custom_list_item, null);

viewHolder.tv = (TextView)convertView.findViewById(R.id.text1);

convertView.setTag(viewHolder);

} else {

viewHolder = (ViewHolder)convertView.getTag();

}

String value = getItem(position);

viewHolder.tv.setText(value);

return convertView;

}

}

class ViewHolder {

public TextView tv;

}