0

В моем приложении у меня есть 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); 
} 
+0

@DavidWasser что-нибудь добавить, чтобы сделать вопрос яснее? – Jimi

ответ

0

You может передать позицию позиции с ListView в вашу деятельность, когда вы начнете ее следующим образом:

protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    i.putExtra("itemPosition", position); 
    startActivity(i); 
} 

Затем, в другой деятельности, вы можете получить позицию элемента, как это:

int itemPosition = getIntent().getIntExtra("itemPosition", -1); 
if (itemPosition != -1) { 
    // itemPosition is the position in the ListView where the user clicked... 
+0

Спасибо за ответ. Я знаю, как передать идентификатор с помощью 'i.putEtra'. Проблема в том, что мне нужно, чтобы класс contentProvider знал об идентификаторе, который был нажат также, чтобы выполнить запрос базы данных, как в этой части кода 'myDH.fetchQuestions (row)', но я не могу использовать getIntent() в поставщик услуг. Использование 'SimpleCursorAdapter' отлично работает, но я пытаюсь использовать contentprovider, потому что я хочу использовать' LoaderManager', потому что 'startmagingcursor' устарел. – Jimi

+0

Извините, я не понимаю контекста. Можете ли вы опубликовать код в поставщике контента, где это необходимо, и показать, как вы обращаетесь к поставщику контента? Это даст больше контекста, чтобы лучше понять peroblem. –

+0

Я видел вашу электронную почту в вашем профиле, могу ли я отправить изображение, если вам нужно дополнительное объяснение? У меня нет достаточной репутации для публикации изображения в моем вопросе. – Jimi

Смежные вопросы