0

Android アクティビティのアイテムのリストがあります。ユーザーがリスト項目のボタンをクリックしてリストを並べ替え、SQLite データベース内の重み値を更新できるようにしたいと考えています。リストは CursorLoader から取り込まれます。

CursorLoader を使用しないソリューションを実装しました。これは、重みの値は変更されますが、CursorLoader は更新されないことを意味します。リスト アクティビティが再開されるまで、リストの順序は更新されません。

これは、ボタンがクリックされたときにウェイトを調整する関数を呼び出す CursorAdapter のコードです。

    final int rowID = cursor.getInt(cursor.getColumnIndex(Storage.COLUMN_ID));

    Button upButton = (Button) view.findViewById(R.id.activity_edit_move_up);
    upButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v){
            Storage store = new Storage(v.getContext());
            store.increaseActivityWeight(rowID);
        }
    });

これは、重みを変更する Storage SQLiteOpenHelper クラスの関数です。

public void increaseActivityWeight(int activityID) {
    SQLiteDatabase db = getReadableDatabase();

    String[] d = { };
    Cursor c;
    c = db.rawQuery("SELECT _id, weight FROM activity WHERE _id = "+activityID, d); 

    if (c.moveToFirst()) {
        int oldWeight = c.getInt(1);
        int newWeight = oldWeight + 1;

        ContentValues cvSelectedActivity = new ContentValues();
        cvSelectedActivity.put("weight",Integer.toString(newWeight)); 

        db.update(Storage.ACTIVITY_TABLE_NAME, cvSelectedActivity, "_id "+"="+activityID, null);

                    // EDIT: The following code is incomplete. It needs to identify a displaced activity by weight and swap it's weight with that of the old activity. 
        int displacedActivityID = c.getInt(0);
        ContentValues cvDisplacedActivity = new ContentValues();
        cvDisplacedActivity.put("weight",Integer.toString(newWeight)); 

        db.update(Storage.ACTIVITY_TABLE_NAME, cvDisplacedActivity, "_id "+"="+displacedActivityID, null);
    }

    db.close(); 
    c.close();
}

これにより、CursorLoader が開始され、ListActivity でリストが並べ替えられます。

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = { Storage.COLUMN_ID, Storage.ACTIVITY_NAME, Storage.WEIGHT }; 
    CursorLoader cursorLoader = new CursorLoader(getActivity(),
            ActivityContentProvider.CONTENT_URI, projection, null, null, Storage.WEIGHT);
    return cursorLoader;
} 

CursorAdapter 内で CursorLoader にアクセスする方法はありますか? LoaderManager.LoaderCallbacks<Cursor>CursorAdapterに実装を追加できます か?

代替ソリューションを提供するこのチュートリアルを見ました。 http://androidforbeginners.blogspot.it/2010/03/clicking-buttons-in-listview-row.html この方法で実装を開始しましたが、カスタム CursorAdapter に変更しました。理由が思い出せない。

これに関するアドバイスは大歓迎です。

4

0 に答える 0