我有一个 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。我不记得为什么了。
对此的任何建议将不胜感激。