Нещодавно я перейнявся створенням кастомними ListView, такого, щоб замість одного рядка в кожному елементі списку було б кілька рядків: ну наприклад заголовок та підзаголовок. Порився по інету і прийшов до висновку, що адекватного російськомовного туторіал на цю тему на жаль немає. Нічо страшного. Тепер буде. ). Як мінімум російськомовний і сподіваюся адекватний :).
Отже, перш за все спробую описати логіку створення такого ListView, а потім приведу приклад з кодами.
Почнемо з того, що для відображення будь-якої інформації в ListView нам необхідний адаптер - прошарок між вашими даними і їх графічним відображенням в ListView. Якщо ми хочемо звичайний список - то ту все здорово - використовуємо готовий клас StringAdapter і радіємо. Передаємо йому будь-строковий масив, потім передаємо наш адаптер в ListView і отримуємо готовий ListView заповнений елементами строкового масиву. Однак, все стає набагато складніше, коли кожен елемент ListView містить щось більше ніж один рядок. Для такого випадку нам з Вами доведеться створити окремий файл c розміткою (Layout) в якому буде зберігається вміст кожного елемента ListView. Оскільки мені потрібен список з заголовком і підзаголовком я створив вот такой вот файлик:
Зовнішній вигляд розмітки
У нас в файлі розмітки є два текстових поля: перше item_headerText і друге item_subHeaderText.
Наступним кроком створимо конструкцію з заголовком і підзаголовком. Я зробив це ось в такому невеликому класі:
Тепер приступимо до реалізації класу-адаптера. Фактично саме клас-адаптер створює кожен елемент в ListView а значить нашим завданням буде саме створення кожного елемента. Крім цього на клас адаптер покладаються ще деякі інші функції. Особисто я свій адаптер успадкував від абстрактного класу BaseAdapter. Нам необхідно реалізувати декілька його методів. Що я власне і зробив:
Тепер давайте дивитися що тут до чого: конструктор MyAdapter () отримує два параметри: перший - контекст, другий масив значень з яких ми будемо будувати наш ListView. Методи getCount () і getItem () думаю в поясненні не потребують. Найцікавіше відбувається в методі getView (). Цей метод викликається з ListView тоді, коли листя намагається заповнити саму себе за допомогою адаптера. Як параметри сюди приходять номер елемента i, який в даний момент намагається додати ListView, порожній об'єкт someView - це як раз той самий View який ми з вами будемо заповнювати і екземпляр ViewGroup - який є ні що інше як сам заповнюється ListView.
У цьому методі спочатку ми отримуємо примірник класу LayoutInflater - це клас який використовується для створення об'єктів View з їх опису в xml. Потім в переданий нам someView ми закидаємо об'єкт View отриманий з нашого файлу розмітки. І налаштовуємо його параметри - такі як заголовок і підзаголовок! Нічого складного, ура!
Ну і останній елемент - це власне сам клас Activity:
Тут теж ніяких проблем виникнути не повинно. Формуємо список об'єктів і закидаємо його в створюваний анонімний адаптер. Ура, все працює. Ось тут ListViewTutorial можна скачати проект для Eclipse.
Метод onItemClick доданий на прохання Dmitrii. Зауважте, що наша активують реалізує інтерфейс OnItemClickListenr. Відповідно метод onItemClick викликається коли відбудеться клік на якомусь з елементів списку. При кліці ми створюємо вспливающе повідомлення Toast, в котом показуємо заголовок того елемента списку за яким тапнул користувач.
Якщо виникли питання або побажання - пишіть! Постараюся відповісти!
Вам сподобалось? Було корисно? Поділіться!
Здрастуйте, у мене ще одне питання:
Спочатку мій код активності виглядав таким чином:
public class SpisokActivity extends AppCompatActivity @Override
protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState);
setContentView (R.layout.activity_spisok);
ListView lv;
ArrayList data = new ArrayList ();
data.add (new Item ( «arise», «arose», «arisen», «Виникати»));
data.add (new Item ( «be», «was / were», «been», «Бути»));
data.add (new Item ( «bear», «bore», «born / borne», «Народити»));
data.add (new Item ( «beat», «beat», «beaten / beat», «Бити»));
data.add (new Item ( «become», «became», «become», «Ставати»));
lv = (ListView) this.findViewById (R.id.list);
lv.setAdapter (new MyAdapter (this, data));
>
>
Код робочий, але постало питання з відпрацюванням натискання, тоді я написав ось так:
public class SpisokActivity extends android.app.ListActivity @Override
protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState);
setContentView (R.layout.activity_spisok);
ListView lv;
ArrayList data = new ArrayList ();