package my.app.RateListExample;
public class ViewWrapper {
	View base;
	RatingBar rate = null;
	TextView label = null;
	public ViewWrapper(View base) {
		this.base = base;
	}
	RatingBar getRatingBar() {
		if (rate == null) {
			rate = (RatingBar) base.findViewById(R.id.rate);
		}
		return rate;
	}
	public TextView getLabel() {
		if (label == null) {
			label = (TextView) base.findViewById(R.id.label);
		}
		return label;
	}
}
#. RateList 클래스
package my.app.RateListExample;
public class RateList 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 savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		ArrayList<RowModel> list = new ArrayList<RowModel>();
		for (String s : items) {
			list.add(new RowModel(s));
		}
		setListAdapter(new CheckAdapter(this, list));
	}
	private RowModel getModel(int position) {	// 레이블로 사용할 텍스트와 함께 별점 상태를 보관
		return(((CheckAdapter)getListAdapter()).getItem(position));
	}
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		selection.setText(getModel(position).toString());
	}
	class CheckAdapter extends ArrayAdapter<RowModel> {
		Activity context;
		public CheckAdapter(Activity context, ArrayList<RowModel> list) {
			super(context, R.layout.raterow, list);
			this.context = context;
		}
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View raterow = convertView;
			ViewWrapper wrapper = null;
			RatingBar rate = null;
			if (raterow == null) {
				// 레이아웃 파일을 사용해 새로운 행 생성
				LayoutInflater inflater = context.getLayoutInflater();
				raterow = inflater.inflate(R.layout.raterow, null);
				// 생성된 View 인스턴스에 ViewWrapper 인스턴스 생성
				wrapper = new ViewWrapper(raterow);	
				raterow.setTag(wrapper);
				rate = wrapper.getRatingBar();		// 행마다 들어있는 RatingBar
				/*
				 * 선택된 값을 Intager 형태로 변환하는 메소드
				 * 변환된 값은 ArrayAdapter 내에서 해당하는 행이 어디에 위치하는지를 가르키는
			         *  번호다.
				 * 행번호를 찾고나면 해당하는 행과 연동된 RowModel을 찾아온다.
				 * RatingBar에서 새로 선택된 값은 RowModel 인스턴스에 직접 설정한다.
				 */
				RatingBar.OnRatingBarChangeListener l =
					new OnRatingBarChangeListener() {
						@Override
						public void onRatingChanged(RatingBar ratingBar, float rating,
								boolean fromUser) {
							Integer myPosition = (Integer) ratingBar.getTag();
							RowModel model = getModel(myPosition);
							model.rating = rating;
							LinearLayout parent = (LinearLayout) ratingBar.getParent();
							TextView label = (TextView) parent.findViewById(R.id.label);
							label.setText(model.toString());
						}
					};
			} else {
				wrapper = (ViewWrapper) raterow.getTag();
				rate = wrapper.getRatingBar();
			}
			RowModel model = getModel(position);
			wrapper.getLabel().setText(model.toString());
			rate.setTag(new Integer(position));
			rate.setRating(model.rating);
			return raterow;
		}
	}
	class RowModel {
		String label;
		float rating=2.0f;
		RowModel(String label) {
			this.label=label;
		}
		public String toString() {
			if (rating>=3.0) {
				return(label.toUpperCase());
			}
			return(label);
		}
	}
}
 
댓글 없음:
댓글 쓰기