私のコードでは、現在、リストビューを適切に更新するために、データベース情報を再フェッチして、を再作成する必要がありますSimpleCursorAdapter
。
たとえば、リストビュー内にボタンがあります。このボタンをクリックすると、リストビューアイテムのエントリがデータベースから削除されます。したがって、アダプターを再作成せずに、リストビューからアイテムを削除するだけです。
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);
}
リストビューアイテム内の削除ボタンのコード:
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に設定されます。これは、クリックするとアクティビティを開始する編集ボタンもあるので便利です。編集が完了した後に戻ってきても、ユーザーのボタンが表示されます。
とにかく、誰かがアダプターを再作成せずにリストを更新する方法を教えてもらえますか?それとも私が最善の方法を実行したのでしょうか?