Android/ListView with RatingBar

ListView with RatingBar example

Soul-Learner 2012. 7. 19. 13:52

Android ListView with RatingBar item

ListView의 리스트 한 행을 표현할 때 RatingBar와 TextView를 포함한 레이아웃 파일을 사용하는 예

rating_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>


rating_row.xml (ListView의 한 행을 표현함)

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="horizontal" > <RatingBar android:id="@+id/ratingBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="3" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:text="TextView" android:textSize="16pt" /> </LinearLayout>


RatingActivity.java

package com.example.androidtest; import android.app.*; import android.content.*; import android.os.*; import android.util.Log; import android.view.*; import android.widget.*; public class RatingActivity extends ListActivity { String[] name = {"강호동", "이수근", "김종민", "은지원", "엄태웅", "유재석", "이경규", "박근혜", "박지원", "김연아", "박지성", "박찬호", "최경주", "이동국", "김태희", "엄기영", "노홍철", "박영일"}; float[] ratings = new float[name.length];// Rating을 변경할 때마다 그 값을 기록할 배열 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rating_main); RatingAdapter adapter = new RatingAdapter(this, R.layout.rating_row, name); setListAdapter(adapter); } class RatingAdapter extends ArrayAdapter<String> { Context ctx; public RatingAdapter(Context context, int textViewResourceId, String[] objects) { super(context, textViewResourceId, objects); ctx = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; if(row==null) { // Object reuse LayoutInflater inflater = getLayoutInflater(); row = inflater.inflate(R.layout.rating_row, parent, false); } TextView tv = (TextView)row.findViewById(R.id.textView1); tv.setText(name[position]); RatingBar rb = (RatingBar) row.findViewById(R.id.ratingBar1); rb.setRating(ratings[position]); rb.setTag(position); rb.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if(!fromUser) return;// 사용자가 터치하여 변경할 때만 유효하게 처리 int index = (Integer)(ratingBar.getTag()); ratings[index] = rating; } }); return row; } } }