概要
MainActivityのみ
データのレイアウトはカードビューに画像とテキストを表示
(MaterialCardView,LinearLayout,ImageView,TextViewを使用)
データリソースはローカルに保存したテキストと画像の固定
パッケージとしてmodel, data, adapterに分割
model:dataクラスとしてAffirmationを定義
data:DatasourceクラスにListを返すメソッドを用意
adpter:RecyclerView.Adapterクラスの子クラスItemAdapterを用意
サンプル
レイアウトxml
メイン画面(activity_main.xml)にRecyclerViewのみ
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager" />
</FrameLayout>
データレイアウト(list_item.xml)
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<ImageView
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="194dp"
android:importantForAccessibility="no"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:textAppearance="?attr/textAppearanceHeadline6" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
modelパッケージ
Affirmation.kt:
1レコード分のデータの型を定義
// dataクラス
data class Affirmation (
@StringRes val stringResourceId: Int,
@DrawableRes val imageResourceId: Int
)
dataパッケージ
Datasource.kt:
RecyclerViewで表示するListデータを戻す
class Datasource {
// Listデータを戻す
// Listのデータ型はAffirmation(Dataクラス)
// 通常はDBなどのリソースからデータを取得するが固定値を出力するサンプルデータ
fun loadAffirmations(): List<Affirmation> {
return listOf<Affirmation>(
Affirmation(R.string.affirmation1, R.drawable.image1),
Affirmation(R.string.affirmation2, R.drawable.image2),
Affirmation(R.string.affirmation3, R.drawable.image3),
Affirmation(R.string.affirmation4, R.drawable.image4),
Affirmation(R.string.affirmation5, R.drawable.image5),
Affirmation(R.string.affirmation6, R.drawable.image6),
Affirmation(R.string.affirmation7, R.drawable.image7),
Affirmation(R.string.affirmation8, R.drawable.image8),
Affirmation(R.string.affirmation9, R.drawable.image9),
Affirmation(R.string.affirmation10, R.drawable.image10)
)
}
}
adapterパッケージ
ItemAdapter.kt:
RecyclerViewのアダプタを抽象クラスから生成する
抽象メソッド3つの実装する
引数はRecyclerViewを表示する画面と表示するデータ
ネストしたクラス(ItemViewHolder)でTextViewとImageViewを取得しデータセット時に使用
// RecyclerViewのアダプタを抽象クラスから生成する
// 引数はRecyclerViewを表示する画面と表示するデータ
class ItemAdapter(
private val context: Context,
private val dataset: List<Affirmation>
) : RecyclerView.Adapter<ItemAdapter.ItemViewHolder>() {
// ビューホルダーのTextViewとImageViewを取得する
// 個々のデータを表示するTextViewとimageView
class ItemViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView = view.findViewById(R.id.item_title)
val imageView: ImageView = view.findViewById(R.id.item_image)
}
// 抽象メソッド1
override fun onCreateViewHolder(
parent: ViewGroup , // RecyclerView
viewType: Int // RecyclerViewのビュータイプ(異なるViewTypeがある時に使用)
) : ItemViewHolder {
// list_item.xmlからView(adapterLayout)を生成
val adapterLayout = LayoutInflater.from(parent.context)
.inflate(R.layout.list_item, parent, false)
// ViewからItemViewHolderを返す
return ItemViewHolder(adapterLayout)
}
// 抽象メソッド2
override fun onBindViewHolder(
holder: ItemViewHolder,
position: Int) {
// datasetのpositionからitemを設定する
val item = dataset[position]
// ViewHolderのテキストをitemデータから取得しセット
holder.textView.text = context.resources.getString(item.stringResourceId)
// ViewHolderの画像をitemデータから取得しセット
holder.imageView.setImageResource(item.imageResourceId)
}
// 抽象メソッド3
override fun getItemCount() = dataset.size
}
リサイクラービューのアダプタをListAdapterとしたものはRecyclerView(ListAdapter) インターネットからJSONデータを取得し画像表示を参照
トレーニング > KOTLIN を用いた ANDROID の基本 > レイアウト > スクロール可能なリスト > カードを使用して画像の一覧を表示する > 4.回答コード