Подтвердить что ты не робот

Получить выбранный элемент из списка ListView с помощью SimpleCursorAdapter

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

У меня есть базовый ListActivity, который использует Cursor для привязки данных из 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);
}

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

4b9b3361

Ответ 1

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

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 как первый столбец, который обычно имеет место). Однако обратите внимание, что идентификатор передается как часть подписи (см. Последний аргумент в public void onListItemClick(ListView l, View v, int position, long id)), поэтому вам действительно не нужно его извлекать (но вы, безусловно, можете, если хотите записать циклы). Для доступа к другим столбцам вы можете сделать то же самое, просто измените индекс столбца.

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

Ответ 2

Другой способ:

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
            }
});