0

我创建了一个自定义,它将 a 中的一些视图项(a和 a )CursorAdapter绑定到via中的某些列,即:TextViewRatingBarListViewSQL databasebindView()

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的以检索所有新的评级栏评级值?

4

2 回答 2

1

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

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

所以你必须设置一个OnRatinBarChangedListener.

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

        if(fromUser){
             //update value here
        }                     

    }
});

请注意,我们正在检查更改是否来自用户,以免在每次bindView()调用时触发侦听器。

于 2012-07-31T13:17:27.527 回答
1

您也可以在您的inCursor finalonBindView()创建字段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并更新更改的评级。

于 2012-07-31T13:27:01.243 回答