使用notifyDataSetChanged上SimpleCursorAdapter不起作用(Usi

2019-08-04 16:59发布

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

例如,我有一个列表视图中的按钮。 当点击这个按钮,它会从数据库中ListView项的条目。 因此,所有我希望发生的是有从列表视图删除的项目,而无需重新创建适配器。

我试着改变从我的全球SimpleCursorAdapterBaseAdapater (因为它扩展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();
}

我只是觉得它不好的做法,我只是想要一个列表项删除每次已经从数据库中删除重新创建适配器。 就像我说我已经试过notifyDataSetChanged与BaseAdapater,它根本不起作用。

同时,记下的isEditing布尔。 如果编辑按钮被点击操作栏中,显示的删除按钮被设置为true。 这是有用的,因为我也有一个编辑按钮按下时开始的活动,因此,当他们回来,他们完成编辑它仍然显示了用户的按钮后。

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

Answer 1:

在他的决议案芒果的评论的URL完美。

我只是改变了代码中onResume()这样的:

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

    super.onResume();

由于onResume()已经打电话给某人,添加或编辑一个项目后,我想它不会伤害的时候调用它删除按钮被按下考虑不再重现适配器,而不是简单地改变光标。



文章来源: Using notifyDataSetChanged on SimpleCursorAdapter does not work