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);
}
}
}
댓글 없음:
댓글 쓰기