2010-03-08 3 views
0

Я только начинаю с Android SDK, и у меня был быстрый вопрос. Я пытаюсь настроить ListView с прямоугольником цвета слева, а затем немного текста для каждой строки. Я также хочу сделать так, чтобы я мог щелкнуть каждую запись в списке и открыть новое действие, чтобы отобразить некоторую информацию (похожую на список контактов). У кого-нибудь есть примеры, чтобы помочь мне?Использование ListViews на Android?

ответ

1

Если вы хотите избежать подклассификации 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 со следующими пяти параметров:

  1. контекстом моего списка (в моем случае, содержащая активность)
  2. Моего списка (описанная выше)
  3. id моего пользовательского макета для этих элементов (R.layout.custom_list_item)
  4. Строковый массив имен свойств. Это ключи в HashMap из моего метода ToList.
  5. целочисленный массив, который отображает свойства каждого элемента в указанном выше (# 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();    
     } 
    });