我在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。我不记得为什么。
对此的任何建议都将非常感激。