반응형
|
안드로이드 개발 ViewHolder 패턴 이용해서 ListView 성능 향상하는 방법 |
|
환경: Android Studio |
ViewHolder 란 특정 클래스가 아닌 성능 향상을 위한 방법론입니다. Holder 패턴을 응용한 것인데 안드로이드에서 ListView 를 구현할 때 findViewById() 함수의 호출을 줄이기 위한 저장소 입니다. ListView 를 만들려면 여러 행을 추가해야 합니다. 매번 findViewById() 함수를 호출하는 것이 아니라 ViewHolder 클래스를 만들어 각 위젯을 저장합니다. 그리고 다음에 재사용해서 ListView 의 각 행을 구현하는 것이죠.
ViewHolder 는 단순히 위젯을 저장하기 위한 클래스입니다. 성능이 향상되면서 스크롤이 부드러워 집니다. 매번 findViewById()를 호출하지 않아도 되기 때문입니다. ViewHolder 클래스는 다음과 같습니다.
private class ViewHolder{
TextView txtView;
ImageView imgIcon;
}
ViewHolder 를 사용하는 곳은 Adapter 클래스의 getView() 함수가 되겠죠. 각 행을 구현하는 함수 입니다. 첫 행을 구현할 때 인수로 넘어온 View convertView 의 null 여부를 판단해서 findViewById() 를 호출합니다. 그리고 위젯 객체는 ViewHolder 에 저장합니다. 다음 행 부터는 ViewHolder 에 저장한 값들을 참조합니다.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.txtView = (TextView) convertView.findViewById(R.id.txtView);
holder.imgIcon = (ImageView) convertView.findViewById(R.id.imgIcon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ViewHolder 를 구현한 Adapter 클래스의 전체 소스는 다음과 같습니다.
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.gon.monitoring.R;
import java.util.ArrayList;
import java.util.List;
/**
* Created by gon on 2017-11-14.
*/
public class PersonAdapter extends BaseAdapter {
private Context mContext;
private int mLayout;
private List<Person> mItemList;
private LayoutInflater mInflater;
public PersonAdapter(Context context, int layout, ArrayList<Person> itemList){
this.mContext = context;
this.mLayout = layout;
this.mItemList = itemList;
this.mInflater = (LayoutInflater) context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.txtView = (TextView) convertView.findViewById(R.id.txtView);
holder.imgIcon = (ImageView) convertView.findViewById(R.id.imgIcon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtView.setText(mItemList.get(position).getName());
holder.imgIcon.setImageBitmap((position & 1 ) == 1 ? mIcon1 : mIcon2);
return convertView;
}
private class ViewHolder{
TextView txtView;
ImageView imgIcon;
}
}
반응형
'안드로이드 개발' 카테고리의 다른 글
| 안드로이드 개발 No orientation specified, and the default is horizontal. This is a common source of bugs when children are added dynamically. 에러 해결 (0) | 2017.12.06 |
|---|---|
| 안드로이드 개발 Android WebView 로컬 HTML 파일 표현하는 방법 (0) | 2017.12.04 |
| 안드로이드(Android) 개발 컴포넌트 공유 객체 Application 만들어서 사용하는 방법 (0) | 2017.11.30 |
| 안드로이드 개발 가로/세로 화면 전환할 때 배경화면 변경하는 방법 (0) | 2017.11.27 |
| 안드로이드 폰캡 PhoneGap 설치방법, 기본 앱 만들어서 실행하는 방법 (1) | 2017.11.12 |
| 이클립스(Eclipse) 안드로이드 에뮬레이터 연결해서 실행하는 방법 (3) | 2016.11.17 |
| 안드로이드(Android) AlertDialog.Builder 상속받아 화면 디자인 가능한 AlertDialog 만들기 (0) | 2015.06.04 |
| 안드로이드(Android) 자신이 가지고 있는 스마트폰 안드로이드 버전 알아내는 방법 (0) | 2015.05.30 |

