从对话框窗口刷新列表视图的问题

时间:2010-12-15 08:59:35

标签: android database listview dialog refresh

我有一个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传递给 膨胀功能,但仍然无法解决我的问题。不知道 这里发生了什么。我通过将我的物品放在一些下方解决了这个问 其他人和边缘/填充玩,但我真的不喜欢 那解决方案。

1 个答案:

答案 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;
    }