2014. 2. 12. 14:04

ListView
ListView 원리
  • SracpView라는 화면에 보여질 view배열을 가지고 있다.
  • 최초 화면 노출시에 생성되었다가 이후에는 이미 생성된 view를 재활용.
  • ListView의 Adapter의 getView() 메소드의 convertView가 재활용되는 scrapView이므로 NULL인 경우만 새로 생성한다.
ViewHolder를 활용
  • convertView내에서 특정 view를 찾는 경우 매번 findViewById()를 호출하는 것보다 이미 찾은 경우 어딘가에 저장해두는 것이 효율적이다.
  • ViewHolder 패턴을 이용하여 찾은 뷰를 tag에 저장해둔다.
  • ViewHolder holder = new ViewHolder();
    holder.text = (TextView) convertView.findViewById(R.id.text);
    convertView.setTag(holder);
    
  • View타입별로 매번 ViewHolder를 생성하는 것이 번거롭다면 아래와 같은 패턴을 사용할 수 있다.
  • public class ViewHolder {
    	public static  T get(View view, int id) {
    		SparseArray viewHolder = (SparseArray) view.getTag();
    		if (viewHolder == null) {
    			viewHolder = new SparseArray();
    			view.setTag(viewHolder);
    		}
    		View childView = viewHolder.get(id);
    		if (childView == null) {
    			childView = view.findViewById(id);
    			viewHolder.put(id, childView);
    		}
    		return (T) childView;
    	}
    }
    
    HashMap과 SparseArray
    • HashMap은 변환환 키값이 동일한 경우를 위해, 각 키별로 동일한 키값을 가지는 LinkedList를 참조한다.(chaining 기법) 중복된 키가 많은 수록 성능이 떨어지게 된다.
    • 이를 위해 키가 Integer인 경우 HashMap보다 효율적으로 동작하는 SparseArray를 사용한다.

'프로그래밍' 카테고리의 다른 글

Shell Script  (0) 2014.10.13
PostgreSQL  (0) 2014.06.30
Thread Dump  (0) 2014.02.10
Eclipse Error  (0) 2013.12.10
Android DI  (0) 2013.12.02