我有一个填充的 listView 购买自定义 CursorAdapter。我在每一行都有一个按钮,单击该按钮会切换数据库中的值并更改图标视图。该按钮的侦听器被添加到 bindView 方法中。问题是,当这种情况发生时,光标不会更新,所以下次重新绘制列表时(键盘弹出并消失,或者列表滚动)并且图标恢复到原始视图。因为这一切都发生在 CursorAdapter 类中,所以我无法从那里重新加载游标,并且 requery 已被弃用。如何在数据更改时触发重新加载游标?我不想为这个简单的任务使用 ContentProvider 和 ContentObserver。这看起来很基础,但我一直在倾注于这个网站和许多其他网站,
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder mvh = (ViewHolder)view.getTag();
TextView productName = mvh.name;
productName.setText(cursor.getString(cursor.getColumnIndex(ProductsDbAdapter.KEY_PRODUCT_NAME)));
ImageView addShoppingIcon = mvh.addShopIcon;
//get icon state from cursor.
boolean isneeded = (cursor.getInt(cursor.getColumnIndex(ProductsDbAdapter.KEY_PRODUCT_ISNEEDED)) == 0 ? false : true);
//set icon tag with icon data for OnClick
long rowid = cursor.getLong(cursor.getColumnIndex(ProductsDbAdapter.KEY_ROWID));
addShoppingIcon.setTag(new PantryHolder(rowid,inpantry,isneeded));
//set icon bitmap
if(isneeded)
addShoppingIcon.setImageBitmap(MainActivity.mPantryNeedIcon);
else
addShoppingIcon.setImageBitmap(MainActivity.mPantryHasIcon);
//add listener
addShoppingIcon.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
PantryHolder mph = (PantryHolder)v.getTag();
ImageView icon = (ImageView)v;
if(mph.inpantry){
if (mph.isneeded)
icon.setImageBitmap(MainActivity.mPantryHasIcon);
else
icon.setImageBitmap(MainActivity.mPantryNeedIcon);
} else {
if (mph.isneeded)
icon.setImageBitmap(RealMealzActivity.mQuickAddIcon);
else
icon.setImageBitmap(RealMealzActivity.mQuickAddGrayIcon);
}
mph.isneeded = !mph.isneeded;
v.setTag(mph);
//update database using database helper
mDbAdapter.updateIsNeeded(mph.rowid, mph.isneeded);
}
});
}