마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

listview에서 settag()를 이용하는 이유가 무엇인가요?

0 추천

listview 최적화에 대해서 찾아보다가 

public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  if (convertView == null) {
    convertView = mInflater.inflate(R.layout.list_item, null);
    holder = new ViewHolder();
    holder.text = (TextView) convertView.findViewById(R.id.text);
    convertView.setTag(holder);
  } else {
    holder = convertView.getTag();
  }
  holder.text.setText(“position " + position);
  return convertView;
  }
  private static class ViewHolder {
    public TextView text;
  }

다음과 같은 코드를 보았습니다. 하지만 

Textview textview;
public View getView(int position, View convertView, ViewGroup parent) {
  if (convertView == null) {
    convertView = mInflater.inflate(R.layout.list_item, null);
    textView = (TextView)convertView.findViewById(R.id.textView);
} 
  textView.setText(“position " + position);
  return convertView;
}
  private static class ViewHolder {
    public TextView text;
  }

다음과 같이 전역변수로 TextView를 지정하게 되는게 더 적은 오버헤드로

이용이 가능한 방법 같은데 왜 settag와 getTag를 이용하는 것인가요?

고수님들 답변부탁드립니다!

라라라라33 (390 포인트) 님이 2016년 8월 10일 질문

1개의 답변

+1 추천
 
채택된 답변
settag를 사용하는 이유는 view의 재활용을 위해 사용합니다

textview를 전역으로 선언하게되면 초기화 시점과 재사용 시점이 모호해지며, listview의 item개수만큼의 textview을 선언하셔야 합니다

첫번째 if에서 행이 처음 보일경우 listview의 position에 해당하는 view를 생성하고 다음에 보이는 경우 view가 null이 아니므로 else를 타게되어 재사용하게 됩니다

또한, viewholder를 사용하지 않으면 스크롤을 위아래로 하시다보면 내용이 뒤죽박죽 되는 경우도 발생하게 됩니다
prague (26,200 포인트) 님이 2016년 8월 11일 답변
라라라라33님이 2016년 8월 12일 채택됨
...