我创建了一个自定义CursorAdapter
,它将TextView
中的某些视图项(RatingBar
和ListView
}绑定到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
以检索所有新的评级栏评级值?
答案 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
并在一次交易中更新已更改的评分。