Я только начинаю с Android SDK, и у меня был быстрый вопрос. Я пытаюсь настроить ListView с прямоугольником цвета слева, а затем немного текста для каждой строки. Я также хочу сделать так, чтобы я мог щелкнуть каждую запись в списке и открыть новое действие, чтобы отобразить некоторую информацию (похожую на список контактов). У кого-нибудь есть примеры, чтобы помочь мне?Использование ListViews на Android?
ответ
Here is an excerpt от one of my books, который обсуждает наличие сложных строк списка, как тот, который вы описываете.
Если вы хотите избежать подклассификации BaseAdapter, но хотите работать с настраиваемыми представлениями элементов и логикой логического элемента элемента на основе объекта, вот что я сделал.
В моем коде я работаю с коллекцией некоторого модельного объекта. Я хочу отобразить эту коллекцию объектов модели в ListView. Я не могу просто передать ArrayList ModelObjects в SimpleAdapter, потому что он ожидает список пар ключ-значение (что-то вроде List<Map<String, Object>>
). Поэтому вместо использования простой коллекции моего объекта в моем приложении я создал пользовательский класс для представления моей коллекции, который просто происходит из структуры, которую я использовал. Таким образом, я могу продолжать использовать его так, как я был, но я могу добавить метод, который преобразует его из дружественной коду коллекции в коллекцию SimpleAdapter. В моем случае я использовал HashMap, связанный с некоторым строковым свойством (то есть HashMap<String, ModelObject>
). Мой пользовательский коллекционный класс будет ModelObjects
(множественное число), распространяемый HashMap<String, ModelObject>
. ModelObjects
затем будет содержать метод ToList()
, где я преобразую свои объекты в ArrayList<? extends HashMap<String, ?>>
, которые затем можно передать конструктору SimpleAdapter, чтобы отобразить его в списке с пользовательским представлением.
Так что теперь я могу построить SimpleAdapter со следующими пяти параметров:
- контекстом моего списка (в моем случае, содержащая активность)
- Моего списка (описанная выше)
- id моего пользовательского макета для этих элементов (R.layout.custom_list_item)
- Строковый массив имен свойств. Это ключи в HashMap из моего метода ToList.
- целочисленный массив, который отображает свойства каждого элемента в указанном выше (# 4) к показам, полученный идентификатор элемента в моем пользовательском макете
Тогда в моем методе OnItemClickListener.onItemClick, я могу использовать arg3 чтобы получить позицию элемента в моем списке, который был нажат, и использовать это, чтобы выделить объект из моей коллекции. Вы можете воздействовать на любые свойства вашего элемента или делать большой переключатель/случай на каком-либо свойстве вашего объекта, чтобы запустить конкретную деятельность или что-то в этом роде.
Единственный трюк заключается в том, что вам необходимо сохранить локальную копию вашей коллекции в пределах действия, которое не будет изменено. В противном случае вы можете искать объект по id в onItemClick и получать другой объект, чем ожидаете. Это может быть немного вне контекста, но вот как выглядит мой код:
ListView lvArtists = (ListView)findViewById(R.id.lvArtists);
SimpleAdapter adapter = new SimpleAdapter(
this,
artists.ToList(),
R.layout.artist_list_item,
new String[] { "name", "imageIdSmall", "tracksCount", "tracksPending" },
new int[] { R.id.artistListItemName, R.id.artistListItemImage, R.id.artistListItemAudioClips, R.id.artistListItemAudioClipsPending }
);
lvArtists.setAdapter(adapter);
lvArtists.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Artist artist = artists.getSortedItem((int)arg3);
mArtistDialog.setArtist(artist);
mArtistDialog.show();
}
});