В моем приложении у меня есть ListActivity
, который извлекает данные из базы данных с помощью LoaderManager
. То, что я хочу сделать, - это когда щелкнуть элемент, я хочу начать другое действие (которое извлекает данные из базы данных и отображает сетку), а также передает идентификатор моему провайдеру контента для выполнения запроса базы данных через поставщика контента. Как это можно сделать?Передача данных двум различным классам с помощью щелчка
Я искал ответы, но я просто не могу найти тот, который решает эту проблему.
Я пытался использовать getIntent() в ContentProvider, но я обнаружил, что getIntent() не работает, как в этом вопросе How do I pass data between Activities in Android application?
Это onListItemClick
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
startActivity(i);
}
Для меня, чтобы создать следующая активность, мне нужно знать, какой элемент был нажат (следовательно, id). Этот идентификатор я, что будет переданы в Content Provider
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
switch (mUriMatcher.match(uri)) {
case QUESTIONS:
Log.d(DBHelper.TAG, "fetching categories");
return myDH.fetchCatgories();
case GRID:
//row here is the id from my list activity
//myDH is an instance of my DB helper class
return myDH.fetchQuestions(row);
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
Я создал urimatcher
. Мой вопрос заключается в том, как получить этот идентификатор из моего списка, чтобы стать аргументом для этого запроса. Я использую LoaderManager, поэтому мне нужно сделать запрос от поставщика контента.
Это класс ContentProvider
private static final int QUESTIONS = 1;
private static final int GRID = 2;
TestAdapter myTestAdapter;
DBHelper myDH;
private static final UriMatcher mUriMatcher;
static {
mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
mUriMatcher.addURI(AUTHORITY, BASE_PATH_CATEGORY, QUESTIONS);
mUriMatcher.addURI(AUTHORITY, BASE_PATH_GRID, GRID);
}
@Override
public boolean onCreate() {
myDH = new DBHelper(getContext());
try {
myDH.createDatabase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myDH.openDatabase();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
switch (mUriMatcher.match(uri)) {
case QUESTIONS:
Log.d(DBHelper.TAG, "fetching categories");
return myDH.fetchCatgories();
case GRID:
//this is where i need the position that was clicked
//so that i can use this value in the DBHelper.
return myDH.fetchQuestions(row);
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
Я использую ContentProvider общаться с моим DBHelper. Это релевантная часть кода
//DBHelper Code
public Cursor fetchQuestions(long row) throws SQLException{
Cursor cursor = myDataBase.rawQuery("select _id, used, question_level from questions_en where category" + " = " + row, null);
return cursor;
}
Вернувшийся курсор будет использоваться в другой деятельности для заполнения сетки.
Без использования LoaderManager, (этот метод работает, но он использует устаревшую startManagingCursor) это соответствующий код listActivity
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, QuestionSelection.class);
i.putExtra(DBHelper.KEY_ID, id);
startActivity(i);
}
Сейчас в OnCreate следующей операции по:
protected void onCreate(Bundle savedInstanceState) {
Bundle extras = getIntent().getExtras();
rowId = extras.getLong(DBHelper.KEY_ID);
mDbHelper = new DBHelper(this);
try {
mDbHelper.createDatabase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mDbHelper.openDatabase();
Cursor cursor = mDbHelper.fetchQuestions(rowId);
startManagingCursor(cursor);
String[] from = {DBHelper.KEY_ID, "question_level", "used"};
int[] to = {R.id.grid_text, R.id.grid_image_right, R.id.grid_image_left};
GridView grid = (GridView)findViewById(R.id.question_grid);
mAdapter = new SimpleCursorAdapter(this, R.layout.grid_item, cursor, from, to);
grid.setAdapter(mAdapter);
}
@DavidWasser что-нибудь добавить, чтобы сделать вопрос яснее? – Jimi