如何迭代Android ListView以获得RatingBar值?

时间:2012-07-31 13:05:36

标签: android database listview android-cursoradapter ratingbar

我创建了一个自定义CursorAdapter,它将TextView中的某些视图项(RatingBarListView}绑定到SQL中的某些列database来自bindView(),即:

public class MyCursorAdapter extends CursorAdapter {
    ...

    public void bindView(View view, Context context, final Cursor cursor) {
        TextView name = (TextView)view.findViewById(R.id.name);
        name.setText(cursor.getString(cursor.getColumnIndex(MyDbAdapter.KEY_NAME)));
        RatingBar rating = (RatingBar)view.findViewById(R.id.life_bar_rating);
        rating.setRating(cursor.getFloat(cursor.getColumnIndex(MyDbAdapter.KEY_RATING_VALUE)));
    }

    ...
}

我想获得所有RatingBar评级值的绝对最新版本,以便我可以相应地更新database(一次性)。我最初尝试使用cursor中的CursorAdapter,但我注意到cursor只包含存储在database中的值,而不是最新的用户更改 - 是这个预期(文档有点模糊)?。

我猜我需要以某种方式迭代实际的视图 - 我将如何遍历我的ListView以检索所有新的评级栏评级值?

2 个答案:

答案 0 :(得分:1)

是的,这是预期的,因为当调用bindView()时,您正在从数据库中检索值并更新RatingBar

因此,当用户更改值时,您必须单独更新每个评级栏的数据库。

所以你必须设置OnRatinBarChangedListener

rating.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
    public void onRatingChanged(RatingBar ratingBar, float rating,
        boolean fromUser) {

        if(fromUser){
             //update value here
        }                     

    }
});

请注意,我们正在检查更改是否为 fromUser ,以便不会在每次bindView()次调用时触发侦听器。

答案 1 :(得分:1)

您还可以在Cursor中设置final onBindView(),在HashMap<id, rating> mRatings;

中创建字段CursorAdapter
public class MyCursorAdapter extends CursorAdapter implements RatingBar.OnRatingBarChangeListener {

    public void bindView(View view, Context context, final Cursor cursor) {
        ...
        rating.setTag(cursor.getPosition());
        rating.setOnRatingBarChangeListener(this);
        ...
    }

    @Override
    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromTouch) {
        Integer position = (Integer) ratingBar.getTag();
        Cursor c = getCursor();
        c.move(position);
        int id = cursor.get id;
        mRatings.add(id, rating);
    }

稍后您遍历mRatings并在一次交易中更新已更改的评分。