我有一个listview和我对CursorAdapter的实现。作为一个 我的列表项的一部分我有一个删除按钮。当用户按下时 按钮我显示一个对话框,要求确认以及用户是否按下 好的,我从数据库中删除该项目。问题在于提神 列表视图。我试过调用cursor.requery()和 mAdapter.notifyDataSetChanged()(单独或两者)但不是 救命。 Requery清除列表并重新出现(没有丢失 item)重新进入活动后。 notifyDataSetChanged 什么都没有(该项目仍在列表中)并且再次没有 进入活动。我成功地完成了这项工作 重新加载整个数据库:
//in the dialog:
{
DBAdapter db = new DBAdapter( getApplicationContext() );
db.open();
db.deleteTitle( rowid );
db.close();
//cursor.requery();
//mAdapter.notifyDataSetChanged();
fillData();
}
private void fillData() {
try{
db.open();
cursor = db.getAllTitles();
startManagingCursor(cursor);
mAdapter = new MyIDsListCursorAdapters(this, R.layout.myidsrow,
cursor, columns, to);
setListAdapter(mAdapter);
db.close();
}catch (SQLException e){
showDatabaseErrorDialog ();
}
}
但重新加载整个数据库似乎是一项非常昂贵的任务而且我是 非常肯定必须有更好的方法来做到这一点。
我还有另一个问题 - 我的listview项目由a定义 RelativeLayout的。然而,布局似乎忽略了所有'垂直' 属性,如alignParentBottom或centerVertical。我见过一个 与Romain Guy谷歌I / O,他回答了类似的问题 说我们应该将父ViewGroup后跟false传递给 膨胀功能,但仍然无法解决我的问题。不知道 这里发生了什么。我通过将我的物品放在一些下方解决了这个问 其他人和边缘/填充玩,但我真的不喜欢 那解决方案。
答案 0 :(得分:0)
不推荐使用requery。 在我的实现中,我只是重新创建光标,这似乎工作。这是我的代码位。在我的例子中,我使用上下文菜单标记列表视图中的项目,但基本方法应该适合您。
private Cursor fetchCursor(){
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
return mDbHelper.fetchSpellSearch(query);
} else {
return mDbHelper.fetchAllSpells();
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case 0:
mDbHelper.updateFavorite(info.id, 1);
new bgRequery().execute();
return true;
case 1:
mDbHelper.updateFavorite(info.id, 0);
new bgRequery().execute();
return true;
default:
return super.onContextItemSelected(item);
}
}
private class bgRequery extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... voids ) {
mSpellCursor = fetchCursor();
return null;
}