在SimpleCursorAdapter上使用notifyDataSetChanged不起作用

时间:2012-12-25 23:44:29

标签: android listview simplecursoradapter baseadapter

在我的代码中,为了正确刷新列表视图,我必须重新获取数据库信息并重新创建SimpleCursorAdapter

例如,我在listview中有一个按钮。单击此按钮时,它将从数据库中删除listview项的条目。所以我想要发生的是将项目从列表视图中删除,而不必重新创建适配器。

我尝试将全局从SimpleCursorAdapter更改为BaseAdapater(因为它扩展了SimpleCursorAdapater并允许使用notifyDataSetChanged()函数),但它仍然没有不行。

以下是我现在使用的代码(确实有效):

global声明代码和onCreate()

private RoutinesDataSource datasource;
private SimpleCursorAdapter dataAdapter;
private boolean isEditing = false;
private Toast toast_deleted;
private String[] columns = new String[] { MySQLiteHelper.COLUMN_NAME };
private int[] to;

@SuppressLint("ShowToast")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_routines);

    toast_deleted = Toast.makeText(this, "", Toast.LENGTH_SHORT);
    datasource = new RoutinesDataSource(this);
    datasource.open();

    Cursor cursor = datasource.fetchAllRoutines();
    to = new int[] { R.id.listitem_routine_name };
    dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_routine, cursor, columns, to, 0);
    setListAdapter(dataAdapter);
}

listview项目内删除按钮的代码:

public void onClick(View view) {        
    ListView l = getListView();
    int position = l.getPositionForView(view);

    Cursor cursor = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
    cursor.moveToPosition(position);
    long id = cursor.getLong(cursor.getColumnIndex(MySQLiteHelper.COLUMN_ID));
    String name = cursor.getString(cursor.getColumnIndex(MySQLiteHelper.COLUMN_NAME));

    switch (view.getId()) { 

        case R.id.button_routine_delete:
            toast_deleted.setText(getString(R.string.toast_routine_deleted));
            toast_deleted.show();
            datasource.deleteRoutine(id);
            onResume();
            break;
    }
}

请注意我使用onResume()

我知道datasource.deleteRoutine(id)有效,因为当我关闭活动并重新打开活动时,列表项就消失了。

onResume()的代码,该列表正确显示列表视图项目列表:

@Override
protected void onResume() {
    datasource.open();
    Cursor cursor = datasource.fetchAllRoutines();

    if (isEditing) {
        to = new int[] { R.id.listitem_routine_edit_name };
        dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_routine_edit, cursor, columns, to, 0);
        setListAdapter(dataAdapter);
    }
    else {
        to = new int[] { R.id.listitem_routine_name };
        dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_routine, cursor, columns, to, 0);
        setListAdapter(dataAdapter);
    }

    super.onResume();
}

我只是认为每次我只想删除已从数据库中删除的列表项时重新创建适配器是不好的做法。就像我说过我用BaseAdapater尝试过notifyDataSetChanged而它根本不起作用。

还要注意isEditing布尔值。如果在操作栏中单击编辑按钮(显示删除按钮),则设置为true。这很有用,因为我还有一个编辑按钮,可以在点击时启动一个活动,因此当他们完成编辑后回来时,它仍会显示用户的按钮。

所以无论如何,有人可以指出我如何在不重新创建适配器的情况下刷新列表 - 或者是我做过最好的方法吗?

1 个答案:

答案 0 :(得分:5)

芒果对他的决议评论的网址运作得很好。

我刚刚将onResume()内的代码更改为:

    datasource.open();
    Cursor cursor = datasource.fetchAllRoutines();
    dataAdapter.changeCursor(cursor);

    super.onResume();

由于在有人添加或编辑某个项目之后已经调用了onResume(),我认为在按下删除按钮时调用它不会有任何问题,因为它不再重新创建适配器,而只是更改光标。