Android - Получение идентификатора элемента ListView [Особый случай] - PullRequest
0 голосов
/ 11 июля 2011

В моем классе БД есть метод, который возвращает курсор.курсор будет содержать данные из разных таблиц:

public Cursor fetchFavTitles() {
    return myDataBase.rawQuery("SELECT rowid as _id, title, fav FROM table1 " +
                                "WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table2 WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table3 WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table4 WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table5 WHERE fav = 1 UNION ALL " +
            "SELECT rowid as _id, title, fav FROM table6 WHERE fav = 1", null);

}

Затем я использую SimpleCursorAdapter ca, чтобы прикрепить Cursor к ListView lv:

Cursor cursor = myDbHelper.fetchTitles(c);
String[] columns = {cursor.getColumnName(1)}; 
int[] columnsLayouts = {R.id.item_title};
ca = new SimpleCursorAdapter(this.getBaseContext(), R.layout.items_layout, cursor,columns , columnsLayouts);
lv = getListView();
lv.setAdapter(ca);

Теперь, еслиЯ выбираю любой элемент в ListView, я хочу иметь ссылку на этот идентификатор элемента. Я хочу, чтобы идентификатор извлекал другую информацию из таблицы, к которой принадлежит элемент.И получить его в другой деятельности MsgView

Я попробовал это:

  • есть ссылка на идентификатор, переданный при нажатии элемента

  • передать это значение с намерением, чтобы другое действие получило необходимые данные, используя это переданное значение.

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
            Intent i = new Intent(view.getContext(), MsgView.class);
                i.putExtra("id", (int) id); //
                startActivity(i);
        }
        });
    

Однако это не сработало.Кажется, что идентификатор, который я использую, не является идентификатором элемента!Любое решение или идеи?

Ответы [ 5 ]

3 голосов
/ 11 июля 2011

В методе onItemClick попробуйте это ...

final SimpleCursorAdapter simpleCursorAdapter = (SimpleCursorAdapter) parent.getAdapter();
final Cursor cursor = simpleCursorAdapter .getCursor();

final int idColIndex = cursor.getColumnIndex(KEY_ROWID); //_id column of your table
final int rowId = cursor.getInt(idColIndex);

В одном из моих проектов здесь используется ссылка ссылка на номер строки 41. Надеюсь, эта помощь.

Edit:

решаемые . Смотрите комментарии.

2 голосов
/ 11 июля 2011

Требуется параметр позиции, а не идентификатор

См. Документацию onItemClick:

public abstract void onItemClick (AdapterView<?> parent, View view, int position, long id) 

Начиная с: Метод обратного вызова уровня 1 API, который вызывается при щелчке элемента в этом AdapterView.

Разработчики могут вызывать getItemAtPosition (position), если им требуется доступ к данным, связанным с выбранным элементом.

Параметры

parent: AdapterView, где произошел щелчок.

представление: представление в AdapterView, по которому щелкнули (это будет представление, предоставленное адаптером)

position: Положение вида в адаптере.

id: идентификатор строки элемента, который был нажат.

0 голосов
/ 12 июля 2011

Я нашел решение своей проблемы.

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

Спасибо за ваши ответы. и особая благодарность @ gopal

0 голосов
/ 11 июля 2011

Вы можете использовать методы View.setTag () и View.getTag () для хранения любых данных в ваших представлениях. Иногда я использовал это, чтобы пометить объект Intent каждой строкой в ​​ListView. Всякий раз, когда мне нужно найти данные для строки, я просто возвращаю Intent с помощью getTag ()

0 голосов
/ 11 июля 2011

Вы можете создать статический член данных в своем классе MsgView, который вы используете для хранения идентификатора, или вы можете отправить отложенное сообщение классу, убедившись, что действие загружается и запускается до того, как сообщение прибудет.

...