2

私のコードでは、現在、リストビューを適切に更新するために、データベース情報を再フェッチして、を再作成する必要があります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に設定されます。これは、クリックするとアクティビティを開始する編集ボタンもあるので便利です。編集が完了した後に戻ってきても、ユーザーのボタンが表示されます。

とにかく、誰かがアダプターを再作成せずにリストを更新する方法を教えてもらえますか?それとも私が最善の方法を実行したのでしょうか?

4

1 に答える 1

6

彼の決議に対するマンゴーのコメントのURLは完全に機能しました。

内部のコードを次のように変更しましたonResume()

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

    super.onResume();

誰かがアイテムを追加または編集した後にすでに呼び出されているのでonResume()、削除ボタンが押されたときにアダプターが再作成されなくなり、カーソルを変更するだけで、それを呼び出すのは問題ないと思いました。

于 2012-12-26T00:08:51.897 に答える