#안드로이드 viewHolder 구현하기 : https://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder
static class ViewHolder {
TextView text;
TextView timestamp;
ImageView icon;
ProgressBar progress;
int position;
}
ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
convertView.setTag(holder);
적용전)
.......................
/**
* 어뎁터의 뷰를 구현하는 함수
* @param position -- 행의 index를 의미
* @param convertView -- 행 전체를 나타내는 뷰를 의미
* @param parent -- 어댑터를 가지고 있는 부모의 뷰를 의미
* @return
*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Context context = parent.getContext();
View v = convertView;
PersonViewHolder viewHolder;
// getView에서 넘어오는 convertView는 이전에 그려졌던 view를 넘기는데요.
// 한번도 inflate되지 않은 view라면 null로 전달되는 경우가 있으니 반드시 null체크는 해야합니다.
if (v == null) {
Log.e("Toggle Track:", "=========== 새로 그려지는 중입니다. ===========");
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.activity_assem_item, parent, false);
}// 캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용한다
else
{
v = (PersonViewHolder) convertView.getTag();
}
// Data Set(assemblyItemList)에서 position에 위치한 데이터 획득
final AssemBean listViewItem = assemblyItemList.get(position);
// 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 데이터 획득
ImageView imgView = (ImageView) v.findViewById(R.id.assem_empImg);
TextView empNmView = (TextView) v.findViewById(R.id.assem_empNm);
TextView origNmView = (TextView) v.findViewById(R.id.assem_origNm);
ToggleButton favoriteBtn = (ToggleButton) v.findViewById(R.id.favorite); // 즐겨찾기 추가
final TextView colorView = (TextView) v.findViewById(R.id.color); // 정당 색깔
// 각 위젯에 데이터 반영
Picasso.with(context).load(listViewItem.getJpgLink()).into(imgView);
empNmView.setText(listViewItem.getEmpNm());
origNmView.setText(listViewItem.getOrigNm());
// 정당 색깔 구분
colorView.setBackgroundColor(Color.rgb(128, 128, 128));
if(listViewItem.getEmpNm().contains("강")) {
colorView.setBackgroundColor(Color.rgb(255, 0, 0));
}
// 즐겨찾기 이미지 설정
favoriteBtn.setBackgroundResource(R.drawable.imgbtn_defalut);
if(listViewItem.getFavorite()){
favoriteBtn.setBackgroundResource(R.drawable.imgbtn_focused);
}
.......................
return v;
}}
적용후)
..................
/**
* 어뎁터의 뷰를 구현하는 함수
* @param position -- 행의 index를 의미
* @param convertView -- 행 전체를 나타내는 뷰를 의미
* @param parent -- 어댑터를 가지고 있는 부모의 뷰를 의미
* @return
*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Context context = parent.getContext();
View v = convertView;
final ViewHolder viewHolder;
// getView에서 넘어오는 convertView는 이전에 그려졌던 view를 넘기는데요.
// 한번도 inflate되지 않은 view라면 null로 전달되는 경우가 있으니 반드시 null체크는 해야합니다.
if (v == null) {
Log.e("Toggle Track:", "=========== 새로 그려지는 중입니다. ===========");
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.activity_assem_item, parent, false);
// 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 데이터 획득
viewHolder = new ViewHolder();
viewHolder.imgView = (ImageView) v.findViewById(R.id.assem_empImg);
viewHolder.empNmView = (TextView) v.findViewById(R.id.assem_empNm);
viewHolder.origNmView = (TextView) v.findViewById(R.id.assem_origNm);
viewHolder.favoriteBtn = (ToggleButton) v.findViewById(R.id.favorite);
viewHolder.colorView = (TextView) v.findViewById(R.id.color);
v.setTag(viewHolder);
}
// 캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용
else{
viewHolder = (ViewHolder) v.getTag();
}
// Data Set(assemblyItemList)에서 position에 위치한 데이터 획득
final AssemBean listViewItem = assemblyItemList.get(position);
if(listViewItem != null){
// 각 위젯에 데이터 반영
Picasso.with(context).load(listViewItem.getJpgLink()).into(viewHolder.imgView);
viewHolder.empNmView.setText(listViewItem.getEmpNm());
viewHolder.origNmView.setText(listViewItem.getOrigNm());
// 정당 색깔 구분
viewHolder.colorView.setBackgroundColor(Color.rgb(128, 128, 128));
if(listViewItem.getEmpNm().contains("강")) {
viewHolder.colorView.setBackgroundColor(Color.rgb(255, 0, 0));
}
// 즐겨찾기 이미지 설정
viewHolder.favoriteBtn.setBackgroundResource(R.drawable.imgbtn_defalut);
if(listViewItem.getFavorite()){
viewHolder.favoriteBtn.setBackgroundResource(R.drawable.imgbtn_focused);
}
....................
return v;
}
public class ViewHolder
{
public int number;
ImageView imgView;
TextView empNmView;
TextView origNmView;
ToggleButton favoriteBtn;
TextView colorView;
}
}
참고 링크