Получить выбранный элемент из ListView, связанный с SimpleCursorAdapter

Я совершенно новый для разработки Android... исходя из iPhone и .Net фона. Я видел очень похожие вопросы, но ни один из них не справился с SimpleCursorAdapter.

у меня есть базовая ListActivity, которая использует курсор для привязки данных из запроса SQLite к моему ListView:

ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {android.R.id.text1}); 

setListAdapter(adapter);

затем, когда элемент нажат:

public void onListItemClick(ListView l, View v, int position, long id) {

    super.onListItemClick(l, v, position,  id);

    //Difference between this:
    Cursor c = (cursor)l.getItemAtPosition(position);
    //and this??
    Cursor c = (Cursor)l.getAdapter().getItem(position);

    int categoryId = c.getInt(0);
}

это правильный способ, чтобы получить идентификатор элемента, который был выбран? Это кажется странным, потому что я не думаю, я мог бы использовать свой курсор после закрытия базы данных (это после привязки). В чем смысл переданного идентификатора, когда я не могу найти способ получить фактический элемент из этого идентификатора? Кроме того, я не понимаю, почему getItemAtPosition() возвращает курсор... курсор привязан ко всему списку, а не только к одной строке. Наконец, если это правильно, есть ли разница между двумя способами получения курсора? Спасибо.

2 ответов


Итак, несколько пунктов: после того, как вы получите курсор, вы хотите позвонить startManagingCursor. Это связывает жизненный цикл курсора с жизненным циклом действия (поэтому, когда действие уничтожается, курсор закрывается/очищается).

startManagingCursor(c);
ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {android.R.id.text1}); 
setListAdapter(adapter);

кроме того, база данных не закрытые, курсор обычно сохраняет живое соединение с БД (поэтому ListView может прокручивать и делать вещи такого рода, которые могут потребовать будущего доступа к содержимому Курсора.

к вашему ядру вопрос, самый простой способ сделать это в onListItemClick это:

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
c.moveToPosition(position);

затем вы можете использовать c.getLong(0) чтобы получить id (предполагая, что вы извлекли столбец id как первый столбец, который обычно имеет место). Однако обратите внимание, что идентификатор передается как часть подписи (см. Последний аргумент в public void onListItemClick(ListView l, View v, int position, long id)) так что вам действительно не нужно снова его получать (но вы, конечно, можете, если хотите сжечь циклы). Для доступа к другим столбцам вы можете сделать то же самое, просто измените столбец индекс.

надеюсь, это поможет.


иначе:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) {

            Cursor cursor = (Cursor) parent.getAdapter().getItem(position);
            //TODO
            }
});