2010년 2월 23일 화요일

[android] ListView 홀더패턴..

#. ViewWrapper 클래스
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);
}

}
}





댓글 없음:

댓글 쓰기