package my.app.ViewWrapper;
class ViewWraper {
	/*
	 * 모든 View 객체는 setTag()와 getTag()를 가지고 있다.
	 * 객체마다 원하는 데이터를 넣어 둘 수 있도록 준비된 메소드.
	 * 홀더패턴은 View에 홀더 객체를 태그로 설정해두고,
	 * 해당하는 행을 사용할때는 필요한 내부 객체에 대한 참조를 갖고 있기 때문에
	 * findViewById 메소드를 매번 호출할 필요가 없다.
	 *
	 *  이 클래스는 내부 위젯에 대한 참조를 보관 / 값을 채워넣는 레이지로딩 방법도 적용하고있음.
	 *  Wrapper 인스턴스를 생성했어도 실제로 호출하지 않으면 findViewById()는 호출되지 않으므로
	 *   => 결과적으로 CPU를 최대한 효율적으로 사용가능하다.
	 */
	View base;
	TextView label = null;
	ImageView icon = null;
	ViewWraper(View base) {
		this.base = base;
	}
	TextView getLabel() {
		if (label == null) {
			label = (TextView) base.findViewById(R.id.label);
		}
		return (label);
	}
	ImageView getIcon() {
		if (icon == null) {
			icon = (ImageView) base.findViewById(R.id.icon);
		}
		return (icon);
	}
}
#. ViewWrapperExample
package my.app.ViewWrapper;
public class ViewWrapperExample extends ListActivity {
		TextView selection;
		String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel",
				"ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante",
				"porttitor", "sodales", "pellentesque", "augue", "purus"};
		@Override
		protected void onCreate(Bundle icicle) {
			super.onCreate(icicle);
			setContentView(R.layout.main);
			setListAdapter(new IconicAdapter(this));
			selection = (TextView) findViewById(R.id.selection);
		}
		private String getModel(int position) {
			return (((IconicAdapter)getListAdapter()).getItem(position));
		}
		@Override
		protected void onListItemClick(ListView l, View v, int position, long id) {
			selection.setText(getModel(position));
		}
		class IconicAdapter extends ArrayAdapter<String> {
			Activity context;
			public IconicAdapter(Activity context) {
				super(context, R.layout.row, items);
				this.context = context;
			}
			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				View row = convertView;
				ViewWraper wrapper = null;
				// 필요한 경우에만 행별 위젯생성
				if ( row == null ) {
					LayoutInflater inflater = context.getLayoutInflater();
					row = inflater.inflate(R.layout.row, null);
					wrapper = new ViewWraper(row);
					// 홀더패턴 설정
					row.setTag(wrapper);
				} else {
					wrapper = (ViewWraper) row.getTag();
				}
				wrapper.getLabel().setText(getModel(position));
				if (getModel(position).length() > 4) {
					wrapper.getIcon().setImageResource(R.drawable.delete);
				} else {
					wrapper.getIcon().setImageResource(R.drawable.ok);
				}
				return (row);
			}
		}
}
댓글 없음:
댓글 쓰기