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;
}
'PROGRAMING > Android' 카테고리의 다른 글
[widget]android.widget.CursorAdapter, ViewHolder pattern (0) | 2013.02.19 |
---|---|
android.database.Cursor 와 ContentProvider[Uri] (0) | 2013.02.18 |
[widget]android.widget.ListView [2] CustomArrayAdapter --getView (0) | 2013.02.18 |
[widget]android.widget.ListView [1] (0) | 2013.02.18 |
Activity 생명주기. (0) | 2013.01.08 |