Динамические данные в представлениях списков
291
Android
В некоторых компонентах Android, таких
как медиаплеер
ExoPlayer
, поддер
-
живается понятие «источника данных». Также в Android существует понятие
«контент-провайдера» – компонента, например, предоставляющего информа
-
цию о контактах в телефоне для использования в вашем приложении. Однако
компоненты, которые используют шаблон «Адаптер», обычно оставляют воз
-
можность использовать произвольные источники данных. Данные могут быть
определены непосредственно в коде, в виде списка объектов, в XML-файле на
устройстве, в документе JSON, хранящемся в памяти или получаемом от веб-
службы.
В нашей пробной версии приложения мы просто добавили все наши данные
в статический массив объектов
Book
. Несмотря на определенные удобства, та
-
кой массив сложно поддерживать в актуальном состоянии – всякий раз, когда
в библиотеку поступит новая книга, нам придется обновить этот массив и опуб-
ликовать новую версию приложения, надеясь, что все наши пользователи при
-
лежно обновят его. В долгосрочной перспективе мы, скорее всего, придем
к использованию веб-службы, которая может обновляться администраторами
библиотеки, и будем извлекать список книг из нее, периодически обращаясь
к соответствующим конечным точкам службы. Также мы непременно захотим
сохранить данные локально, а если у нас появится желание реализовать воз
-
можность сортировки или фильтрации с использованием хорошо известного
и проверенного SQL, мы наверняка захотим преобразовать ответы JSON, воз
-
вращаемые
веб-службой, в записи в базе данных.
Но все это – отдаленная перспектива, а пока давайте создадим простой
интерфейс, предоставляющий необходимую
информацию нашему адаптеру,
и обновим адаптер, чтобы он соответствовал этому контракту. После этого мы
сможем вносить изменения по мере развития наших требований и возмож
-
ностей.
Давайте взглянем на наш адаптер еще раз и посмотрим, как его изменить,
чтобы он удовлетворял изменившимся требованиям:
Java
public class
BrowseBooksAdapter extends RecyclerView.Adapter
{
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(new TextView(parent.getContext()));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(Book.SAMPLE_DATA[position].getTitle());
}
@Override
public int getItemCount() {
return Book.SAMPLE_DATA.length;
}
292
Моделирование каталога библиотеки
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView mTextView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mTextView = (TextView) itemView;
}
}
}
Kotlin
class BrowseBooksAdapter :
RecyclerView.Adapter
() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(TextView(parent.context))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.mTextView.text = Book.SAMPLE_DATA[position].title
}
override fun getItemCount(): Int {
return Book.SAMPLE_DATA.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val mTextView: TextView
init {
mTextView = itemView as TextView
}
}
}
Как видите, мы дважды обращаемся к статическому источнику данных –
один раз при прокрутке представления, когда требуется обновить видимый
элемент (в данном случае название книги), и второй раз, чтобы определить
общее количество книг в нашем каталоге и
RecyclerView
смог узнать, когда пре
-
кратить прокрутку. Интерфейс подобного источника данных можно было бы
определить так:
Do'stlaringiz bilan baham: