在我的代码,现在,为了正确刷新列表视图我不得不重新获取我的数据库信息并重新创建SimpleCursorAdapter
。
例如,我有一个列表视图中的按钮。 当点击这个按钮,它会从数据库中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();
}
我只是觉得它不好的做法,我只是想要一个列表项删除每次已经从数据库中删除重新创建适配器。 就像我说我已经试过notifyDataSetChanged与BaseAdapater,它根本不起作用。
同时,记下的isEditing
布尔。 如果编辑按钮被点击操作栏中,显示的删除按钮被设置为true。 这是有用的,因为我也有一个编辑按钮按下时开始的活动,因此,当他们回来,他们完成编辑它仍然显示了用户的按钮后。
所以不管怎么说,能有人指出我如何刷新列表,而无需重新创建适配器 - 或者是我做了什么的最好方法是什么?