Android: определить отдельные элементы в строке ListView?

У меня есть ListView в ListActivity, заполненный таблицей базы данных. Каждая строка ListView представляет собой RelativeLayout с тремя объектами TextView с именами rowid, date и name в указанном порядке. Я могу программно выбирать отдельные строки, используя метод .setSelection(int position) ListView.

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

Я подозреваю, что для этого потребуется работа с адаптером, но я пытался/искал в Интернете в течение недели и не смог понять это. Спасибо за помощь, которую может оказать любой.


person spryan    schedule 24.02.2011    source источник


Ответы (2)


Вы знаете позицию текущего выбранного элемента в списке, у вас есть кнопка за пределами ListView, которая должна инициировать какое-то действие над этим элементом, и вы не просто делаете строки ListView (или некоторые дочерние представления в каждой строке) доступными для щелчка. Правильно?

Вы можете получить информацию из адаптера списка. getItem(int position) возвращает объект, представленный элементом списка в позиции, поэтому вы можете получить необходимую информацию напрямую, если она хранится в объекте. getView(int position) возвращает представление для строки, позволяя вам использовать findViewById(int id) для получения вашего TextView.

Если у вас еще нет адаптера, вы можете получить его из ListView с помощью getAdapter().

// ListView myListView = the ListView in question
// int selectedRow = the currently selected row in the ListView
// Each row in the ListView is backed by an object of type MyCustomDataClass

int dbRowId;
Adapter adapter = myListView.getAdapter();

MyCustomDataClass data = (MyCustomDataClass) adapter.getItem(selectedRow);
dbRowId = data.getDatabaseRowId();
// OR
dbRowId = data.rowId;
// OR whatever method the object has for getting the ID.

// OR
View listViewRow = adapter.getView(selectedRow);
TextView dbRowView = (TextView) listViewRow.findViewById(R.id.rowid);
String dbRowAsString = dbRowView.getText().toString();
dbRowId = Integer.parseInt(dbRowAsString);

Вы также можете подумать, не будет ли более естественным для пользователя просто коснуться строки ListView, а не выбирать строку, а затем нажимать другую кнопку. Ответ Рено может работать лучше.

person erichamion    schedule 24.02.2011
comment
Это именно то, что я искал. Большое спасибо! Какое отличное сообщество. - person spryan; 25.02.2011

В итоге я использовал последний метод со следующим кодом.

int dbRowId;
Adapter adapter = myListView.getAdapter();

View listViewRow = adapter.getView(selectedRow);
TextView dbRowView = (TextView) listViewRow.findViewById(R.id.rowid, null, null);
String dbRowAsString = dbRowView.getText().toString();
dbRowId = Integer.parseInt(dbRowAsString);

Единственное изменение, которое мне пришлось сделать, это добавить null, null к параметрам в .findViewByID.

TextView dbRowView = (TextView) listViewRow.findViewById(R.id.rowid, null, null);
person spryan    schedule 24.02.2011