我可以在CursorAdapter按钮OnClickListener中访问CursorLoader吗?

时间:2013-10-18 10:55:46

标签: android sqlite android-button android-cursoradapter android-cursorloader

我在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。我不记得为什么。

对此的任何建议都将非常感激。

0 个答案:

没有答案