Динамические данные в
представлениях списков
293
Java
public class
BrowseBooksAdapter extends RecyclerView.Adapter
{
private final BookDataSource mSource;
public BrowseBooksAdapter(BookDataSource source) {
super();
mSource = source;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(new TextView(parent.getContext()));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Book book = mSource.get(position);
holder.textView.setText(book.getTitle());
}
@Override
public int getItemCount() {
return mSource.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = (TextView) itemView;
}
}
}
Kotlin
class BrowseBooksAdapter(private val source: BookDataSource) :
RecyclerView.Adapter() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(TextView(parent.context))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val book = source[position]
holder.textView.text = book.title
}
override fun getItemCount(): Int {
return source.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView as TextView
}
}
294
Моделирование каталога библиотеки
Ничего сложного! Если мы захотим продолжать использовать статический
массив, можно создать простой класс, реализующий интерфейс
BookDataSource
,
но использующий список, зашитый в код:
Java
public class HardCodedBookDataSource implements BookDataSource {
public Book get(int index) {
return Book.SAMPLE_DATA[index];
}
public int size() {
return Book.SAMPLE_DATA.length;
}
}
Kotlin
class HardCodedBookDataSource : BookDataSource {
override val size: Int
get() = Book.SAMPLE_DATA.size
override operator fun get(index: Int): Book {
return Book.SAMPLE_DATA[index]
}
}
Возможно, вы не заметили, но контракт, определяемый интерфейсом
Book
DataSource
, неявно поддерживается
всеми реализациями
List
– то есть
предоставить источник данных можно, как показано ниже:
Java
public class Books extends ArrayList implements BookDataSource {}
Kotlin
class Books : ArrayList(), BookDataSource
Определив источник данных таким способом, вы автоматически получите
в свое распоряжение все замечательные операции, поддерживаемые классом
List
, такие как
add
,
addAll
,
set
,
remove
,
subList
и т. д.
И даже притом что мы все еще используем статический список книг, нам не
придется вносить никаких изменений в наш
RecyclerView
или адаптер
Browse
BooksAdapter
, за исключением использования нового источника в адаптере, ко
-
торый может получать данные от веб-службы или читать их из локальной базы
данных. Отлично! Наш список стал более динамичным, даже притом что ис
-
пользует те же данные, что и раньше.
Мы продолжим подготовку к удалению статического массива книг далее
в этой главе, а сейчас посмотрим, как то же самое реализовать в iOS.
iOS
По аналогии с реализацией шаблона «Адаптер» в Android, нам нужно создать
некоторый промежуточный слой, отделяющий контроллер от исходных дан
-
Динамические данные в представлениях списков
295
ных. С этой целью можно добавить новый объект, с которым будет взаимодей
-
ствовать контроллер.
Как вы наверняка помните, в контроллере
CatalogView
Controller
мы реализовали поддержку протокола
UITableViewDataSource
для
передачи данных в табличное представление.
Это помогло нам на первом этапе, но почему бы не создать отдельный объ
-
ект для прямой передачи данных в табличное представление? Контроллер мог
бы управлять этим объектом источника данных и табличным представлением.
Так мы сможем отделить контроллер от представления – в данном случае от
табличного представления – и слоя данных.
Добавим в проект новый файл с классом
ListDataSource
, выбрав в меню пункт
Do'stlaringiz bilan baham: