ListView는 화면에 보여줄 하나의 아이템에 해당하는 뷰를 ArrayAdapter의 getView 메소드에서 만들어낸다. getView에서 View를 생성하고, 데이터를 입혀서 반환하는 방식이다.


getView 메소드를 재정의하는 몇 가지 방식이 있는데, 어떻게 하느냐에 따라 성능의 차이가 있다.


1. 무식한 방법

  • 매 position마다 View를 생성한다.


2. 개선된 방법

  • 안드로이드에서는 선택위젯이 스크롤될 때 View를 재활용하는 메커니즘을 가지고 있어 한 번 만들어진 뷰가 화면 상에 그대로 다시 보일 수 있도록 되어 있다. getView 메소드의 convertView 인자가 null이 아니면 재활용하는 방법이다.


3. 더 개선된 방법

  • 2번 방법도 개선의 여지가 있는데, 바로 findViewById라는 메소드이다. 어떤 뷰에서 입력한 id에 해당하는 View를 리턴해 주는 메소드인데, 이 메소드는 layout에서 계층구조가 심해질수록 더 오래걸릴 것이다. 그래서 findViewById 메소드까지 최소한으로 사용하도록 개선하면 더 좋은 성능을 기대할 수 있다.
  • 이를 홀더 패턴을 사용하여 구현할 수 있다. View를 생성하는 시점에 홀더에 View에 대한 정보를 저장하고 setTag메소드를 사용하여 해당 View에 홀더를 지정한다. 이후 View를 재활용하는 시점에서 findViewById메소드를 사용하지 않고 getTag메소드를 통해 해당 View에 대한 정보를 가져온다.

자세한 내용은 여기

+ Recent posts