2010년 2월 23일 화요일

[android] ListView와 RatingBar 사용하기.

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




댓글 없음:

댓글 쓰기