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