2010-08-16 2 views
9

У меня есть активность, которая расширяет ListView. Я заполняю свой список результатами запроса к базе данных sqlite. Элемент списка состоит из start_time, end_time, client_name и состояния. Это 4 бита в информации, которую мне нужно отобразить для каждого элемента списка.присвоение скрытых значений элементу listview

Мой вопрос: возможно ли, чтобы я назначил скрытые элементы этому элементу ListView?

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

EDIT

Кодекс я использую, чтобы заполнить свой список из моего Cursor:

String[] columns = new String[] {VisitsAdapter.KEY_CLIENT_FULL_NAME, VisitsAdapter.KEY_STATUS,VisitsAdapter.KEY_CLIENT_START_TIME, VisitsAdapter.KEY_CLIENT_END_TIME}; 

// the XML defined views which the data will be bound to 
int[] to = new int[] { R.id.name_entry,R.id.number_entry,R.id.start_time_display,R.id.end_time_display }; 

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(HomeScreen.this, R.layout.list_element, cur, columns, to); 

Где R.layout.list_item является XML для моего элемента списка. Я исхожу из фона PHP/HTML, так что, как я обычно здесь делаю, есть скрытое поле для хранения моего значения _id, которое я мог бы получить после того, как элемент списка был нажат. могу ли я сделать что-то подобное в android? могу ли я поместить скрытое поле _id в мой макет xml?

ответ

19

Вы должны попытаться немного расслабить себя из рамок веб-разработки. В вашем представлении нет необходимости хранить такую ​​вещь, как идентификатор в скрытом поле. Это будет смешивать ваши данные с вашим пользовательским интерфейсом и создавать множество путаницы и ненужных объектов вида.

Если вы используете базу данных sqlite для хранения ваших значений, вы должны использовать CursorAdapter для управления списком. CursorAdapter сохраняет результат, полученный из базы данных, и управляет тем, как данные отображаются пользователю. Если вы затем зарегистрируете onItemClickListener на своем ListView, слушатель получит адаптер и позицию элемента данных, чья ячейка была нажата в адаптере. Теперь вы можете использовать getItem для получения курсора, указывающего на результат базы данных, который использовался для создания списка. Теперь вы можете получить идентификатор или все другие значения, которые не отображаются пользователю из результата базы данных и привязать его к намерению начать следующее действие.

+0

Когда вы говорите, что я должен использовать CursorAdapter, вы имеете в виду как противоположность SimpleCursorAdapter в моем примере кода? –

+2

Спасибо за ваш ответ. Выполнив поиск документов в прослушивателях элементов списка, я обнаружил, что onListItemClick автоматически передает rowID результата курсора. (столбец _id из базы данных). Я думал, что все это неправильно (как вы указали), поскольку я предполагал, что мне придется добавить его в элемент списка вручную, я не понимаю, что андроид позаботится об этом автоматически. Спасибо, ответ принят. –

+0

+1 для приятного объяснения ... Но в случае SimpleAdapter, как я могу добиться того же? – hemu

1

Вам следует подумать о создании объекта java, который собрал бы всю эту информацию. Например, вы можете создать класс как «ListItem» и каждый пункт будет иметь 5 свойства:
start_time
end_time
имя_клиента
статус идентификатор (и больше, если вам нужно)

А потом, ты есть 2 варианта: либо вы сериализуете объект, чтобы поместить весь объект в базу данных, либо сохраните структуру, которую у вас уже есть (я полагаю), и каждая строка вашей базы данных становится объектом ListItem. Затем, когда вы запрашиваете свою базу данных, вы помещаете их все в ArrayList и расширяете ArrayAdapter, чтобы создать свой собственный адаптер. Наконец, в методе getView вы вызываете myListItem.getEnd_Time и весь метод, необходимый для отображения ваших данных, и просто не используйте getId, который вы можете напрямую использовать с адаптером, когда вам нужен этот объект.

+0

К сожалению sephy, Im совершенно новый для андроид, и я действительно не следовать вашему ответу, Ive отправил соответствующий код, чтобы показать, где Im приходит из –

+0

Каков этот способ рассмотрения ответа, когда люди тратят время, чтобы объяснить вам вещи, и вы просто голосуете за них. Я не могу в это поверить. – Sephy

+0

Привет, Сефи, я должен указать, что это был не я, который понизил ваш ответ. Я ценю ваш ответ и время, которое вы взяли, чтобы посмотреть на мой вопрос. Я не могу сказать, кто понизил его, как я не знаю. То же самое касается ответа Куроутадори. –

0

Если вам нужно, не отображая, кроме _id дБ COLS, в onItemClick вашего ListView в (...) вы просто звоните:

mAdapter.getCursor(); 

Тогда вы можете получить любые не отображающие COLS выбранного списка пункт/строка.

Как уже упоминался Януш, если вам нужно только _id, просто позвоните:

mAdapter.getItemId(); 
Смежные вопросы