BaseAdapter 최적화
이 섹션 소개:
이전 섹션에서는 ListView를 사용하고 간단한 BaseAdapter를 사용자 정의하는 방법을 배웠습니다. 두 가지 더 중요한 메소드인 getCount() 및 getView()를 볼 수 있습니다. getView는 인터페이스에 있는 열 수만큼 호출됩니다. 이 때 몇 가지 단서를 볼 수 있습니다. 뷰가 새로 확장될 때마다 XML을 구문 분석해야 합니다. 물론, 수십, 수백 개의 열이 있는 목록은 아무런 문제가 없지만, 더 많거나 레이아웃이 더 복잡해지면 어떻게 될까요? 따라서 ListView의 최적화를 배우는 것이 매우 중요하며 이 섹션에서는 BaseAdapter의 최적화를 목표로 합니다. 두 가지 최적화 지점은 다음과 같습니다. 그리고 ViewById를 매번 찾을 필요 없이 ViewHolder를 사용하여 컴포넌트를 재사용해보세요.
1. ConvertView 재사용:
위에서 언급한 것처럼 인터페이스에 몇 개의 항목이 있고 getView 메소드가 몇 번 호출됩니까? 이전 섹션에서 작성한 getView() 코드를 살펴보겠습니다.
public View getView(int position, View ConvertView, ViewGroup parent) {
ConvertView = LayoutInflater.from(mContext).inflate( R.layout.item_list_animal,parent,false);
ImageView img_icon = (ImageView) ConvertView.findViewById(R.id.img_icon);
TextView txt_aName = (TextView) ConvertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) ConvertView.findViewById(R.id.txt_aSpeak);
img_icon.setBackgroundResource(mData.get(position).getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak.setText(mData.get(position).getaSpeak());
return ConvertView;
}
예, inflate()는 매번 xml을 로드해야 합니다. 실제로 이 ConvertView는 우리가 사용할 수 있도록 시스템에서 제공하는 뷰입니다. 객체를 캐시한 다음 앉아서 판단하세요. 최적화된 코드를 수정하세요:
public View getView(int position, View ConvertView, ViewGroup parent) {
if(convertView == null){
ConvertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
}
ImageView img_icon = (ImageView) ConvertView.findViewById(R.id.img_icon);
TextView txt_aName = (TextView) ConvertView. findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) ConvertView.findViewById(R.id.txt_aSpeak);
img_icon.setBackgroundResource(mData.get(position).getaIcon());
tx t_aName. (mData.get(position).getaName());
txt_aSpeak.setText(mData.get(position).getaSpeak());
return ConvertView;
}
2. ViewHolder는 구성요소를 재사용합니다
안녕하세요, getView()는 여러 번 호출되므로 findViewById는 여러 번 호출되어야 하며 ListView의 항목은 일반적으로 레이아웃은 동일합니다. 이 부분은 ViewHolder 클래스를 직접 정의하여 최적화할 수 있습니다. 성능 최적화를 수행하세요! 수정된 코드는 다음과 같습니다.
public View getView(int position, View ConvertView, ViewGroup parent) {
ViewHolderholder = null;
if(convertView == null){
ConvertView = LayoutInflater .from( mContext ).inflate(R.layout.item_list_animal,parent,false);
홀더 = 새 ViewHolder();
홀더.img_icon = (ImageView) ConvertView.findViewById(R.id.img_icon);
홀더.txt_aName = ( TextView ) ConvertView.findViewById(R.id.txt_aName);
holder.txt_aSpeak = (TextView) ConvertView.findViewById(R.id.txt_aSpeak);
ConvertView.setTag(holder); // 홀더를 ConvertView에 저장
}else{
홀더 = (ViewHolder) ConvertView.getTag();
}
홀더.img_icon.setBackgroundResource(mData.get(position).getaIcon());
홀더.txt_aName.setText(mData.get(position).getaName() ) ;
holder.txt_aSpeak.setText(mData.get(position).getaSpeak());
return ConvertView;
}
static class ViewHolder{
ImageView img_icon;
TextView txt_aName;
TextView txt_aSpeak;
}
예, 아주 간단합니다. 나중에 BaseAdapter를 작성하려면 이 템플릿을 따르면 됩니다. 하하, 이것은 ViewHolder를 수정합니다. static은 static으로 정의되건 아니건 그 안에 있는 객체의 수와는 관계가 없습니다. 이것을 여러 곳에서 사용하기 위해 Static이 추가됩니다. 홀더를 사용할 때 클래스는 한 번만 로드하면 됩니다. 한 번만 사용하면 추가 여부는 중요하지 않습니다! ——Berial(B God) 원래 단어~
이 섹션 요약:
좋아, BaseAdapter의 최적화는 아마도 위의 두 가지일 것입니다. 매우 간단하며 ConvertView 및 사용자 정의 ViewHolder를 재사용합니다. findViewById() 호출 횟수를 줄여보세요~ BaseAdapter 최적화를 위한 다른 제안 사항이 있으면 언제든지 제안해 주세요. 감사합니다~