2

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

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

我尝试将我的全局从更改SimpleCursorAdapterBaseAdapater(因为它扩展SimpleCursorAdapater并允许使用该notifyDataSetChanged()函数),但它仍然不起作用。

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

声明代码globalonCreate()

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);
}

列表视图项中删除按钮的代码:

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() 的代码正确显示列表并删除了 listview 项:

@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();
}

我只是认为每次我只想删除已从数据库中删除的列表项时重新创建适配器是不好的做法。就像我说的那样,我已经尝试使用 BaseAdapter 进行 notifyDataSetChanged ,但它根本不起作用。

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

所以无论如何,有人可以指出我如何刷新列表而不必重新创建适配器 - 或者我所做的最好的方法是什么?

4

1 回答 1

6

mango 对他的决议的评论中的 URL 运行良好。

我只是把里面的代码改成onResume()这样:

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

    super.onResume();

由于onResume()在有人添加或编辑项目后已经调用它,我认为在按下删除按钮时调用它不会有什么坏处,因为它不再重新创建适配器,而是简单地更改光标。

于 2012-12-26T00:08:51.897 回答