Заполнение представления списка
281
@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;
}
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) {
val book = Book.SAMPLE_DATA[position]
holder.textView.text = book.title
}
override fun getItemCount(): Int {
return Book.SAMPLE_DATA.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView as TextView
}
}
Если этот код кажется вам запутанным и непрозрачным, то вы правы! Фак
-
тически идея
RecyclerView
изначально была просто
соглашением
. Мы (разработ
-
чики Android) использовали раньше виджет
ListView
, но со временем пришли
к выводу, что использование определенных шаблонов позволяет экономить
память и увеличивать производительность. Без шаблона повторного исполь
-
зования элементов списка простой поиск, возвращающий несколько тысяч
элементов, легко мог бы потребить больше ресурсов, чем доступно приложе
-
нию, особенно на устройствах, выпускавшихся в то время.
Когда класс
RecyclerView
был включен в библиотеку поддержки (до того, как
мы начали использовать современный пакет
androidx
), это соглашение приоб
-
рело осязаемое воплощение в коде, но без понимания исторических предпо
-
сылок некоторые из этих шаблонов и контрактов выглядят малопонятными
и непрозрачными!
282
Вывод
списка с данными
В любом случае, в настоящее время в Android имеется проверенный и вы
-
сокопроизводительный виджет, поэтому потратим немного времени на его
изучение. Начнем с самого низа – статического класса
ViewHolder
. Суперкласс
RecyclerView.ViewHolder
является абстрактным, поэтому, даже когда не требуется
расширять его поведение, вам все равно придется определить его подкласс.
Если бы суперкласс не был абстрактным, мы могли бы просто привести эле
-
мент
itemView
к типу
TextView
в методе
onBindViewHolder
без определения своего
подкласса. Кажется, мы сделали слишком большой шаг! Давайте отступим не
-
много назад и пойдем медленнее.
В самом простом случае
ViewHolder
– это просто пакет ссылок на экземпля
-
ры
View
дочерних представлений. Например, если в каждом элементе вашего
списка
имеется
ImageView
для отображения миниатюрного изображения,
Tex
tView
для обозначения заголовка и еще один
TextView
для отображения списка
авторов книги, экземпляр
ViewHolder
будет включать ссылки на эти три пред
-
ставления, как показано ниже:
Java
public static class ViewHolder extends RecyclerView.ViewHolder {
private ImageView mThumbnailView;
private
TextView mTitleView;
private TextView mAuthorsView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mThumbnailView = itemView.findViewById(R.id.row_thumb);
mTitleView = itemView.findViewById(R.id.row_title);
mAuthorsView = itemView.findViewById(R.id.row_authors);
}
}
Kotlin
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val thumbnailView: ImageView = itemView.findViewById(R.id.row_thumb)
val titleView: TextView = itemView.findViewById(R.id.row_title)
val authorsView: TextView = itemView.findViewById(R.id.row_authors)
}
У вас может возникнуть справедливый вопрос: откуда берутся эти экземпля
-
ры
View
? Отложим на время
ViewHolder
и обратимся к методу
onCreateViewHolder
.
В предыдущем примере мы просто передаем
TextView
конструктору, но в более
сложном пользовательском интерфейсе, например в котором мы использова
-
ли для объяснения
ViewHolder
, нужно
создать дерево представлений, которое
можно определить в макете XML. Каждый элемент списка, например, может
выглядеть так:
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
Заполнение представления списка
283
android:id="@+id/row_thumb"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:orientation="vertical"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content">
android:id="@+id/row_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:id="@+id/row_authors"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Обратите внимание на
трюк с атрибутом
weight
в
LinearLayout
, упоминав
-
шийся в главе 2.
Сохраните этот листинг в файле
Do'stlaringiz bilan baham: