はじめに
初めてのAndroidアプリ開発(Android Studio+Kotlin)でカードビューを実装しようとした時に、「KotlinでRecyclerViewを使ったリスト表示を行う - Qiita」(以下、参考記事)という大変素晴らしい記事を大いに参考にしたのですが、執筆時点(2019年9月7日)の環境では参考記事のコードをコピペするだけだとうまくいかなかったので、補足したいと思います。
初心者でもとりあえず実装したいという人向けなので、中級者以上には役立たないと思います。また、これは補足のための記事であり、補足しない部分のコードは載せていませんので、そこは参考記事を参照してください。
補足したい点
AndroidXに対応させる
Support LibraryがAndroidXという新しいライブラリに移行したようなので、それに対応させます。
importを追記する
当たり前ですけど、パッケージのインポートがもっと必要でした。
array.xmlを用意する
参考記事ではarray.xmlを読み込む設定になっていました。
Kotlinの仕様変更に対応する
これが曲者でした。参考記事の頃とKotlinの仕様が変わっており、コピペだけだとエラーが出る状態になっていました。
実際の補足
AndroidXに対応させる
Android Studioでの外部ライブラリの読み込み方と注意点 - Qiitaを参考に、下記2つのライブラリを読み込む。バージョンは適当でいいと思います。
-androidx.cardview
-androidx.recyclerview
build.gradleに下記の行が挿入されていればOKです。
dependencies {
//省略。バージョンは執筆時点。
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0-beta04'
}
参考記事とはライブラリ名が異なるので、参考記事のactivity_main.xmlとlist_item.xmlも下記のように変化させる必要があります。activity_main.xmlの方はConstraintLayoutもAndroidXのライブラリに変更する必要があります。なお、ライブラリの変更とは関係ありませんが、tools:contextのアドレスは変えておかないとエラーになります。
<androidx.constraintlayout.widget.ConstraintLayout
//他の属性は省略。
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
//属性は省略
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
//属性は省略
>
//省略
</androidx.cardview.widget.CardView>
importを追記する
参考記事中にも一部importが記載されていますが、実際に動作させるにはもっとimportを記載する必要があります。kotlinファイルを作成、コピペした直後は、エラーが出まくっていると思います。MacだとOption+Returnでimportを勝手に追加してくれます。MainActivity.kt、RecyclerAdapter.kt、RecyclerViewHolder.ktにimportを追加すると下記のようになります。import以外は省略しています。
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
array.xmlを用意する
MainActivity.ktの下記のコードを見ると分かりますが、Resourcesのarrayを読みに行っていることが分かります。
val hoges = resources.getStringArray(R.array.hoges).toMutableList()
なので、res>values配下にarray.xmlを作成し、下記のようなitemを用意します。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="hoges">
<item>hoge1</item>
<item>hoge2</item>
<item>hoge3</item>
<item>hoge4</item>
<item>hoge5</item>
</array>
</resources>
Kotlinの仕様変更に対応する
Kotlinのバージョンが変わったことにより、最新のバージョンでは一部の?を取らなくちゃいけないそうです。詳しくは[Android] 'onCreateView' overrides nothingの対処法(自動生成されたメソッドがKotlinのバージョンアップでエラーになってしまう)- みんなのプログラミングを参照してください。どこの?を取らなくちゃいけないかというと、RecyclerAdapter.ktの下記4つのメソッドです。
override fun onAttachedToRecyclerView(recyclerView: RecyclerView?) {
//省略
}
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView?) {
//省略
}
override fun onBindViewHolder(holder: RecyclerViewHolder?, position: Int) {
//省略
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerViewHolder {
//省略
}
それぞれ引数に?(Null許容型)を取っていますが、最新のKotlinではNull許容型のメソッドではなくなったようで、overrideに失敗します。そこで、これらの引数の型から?を取っ払いましょう。
最後に
この記事は、「KotlinでRecyclerViewを使ったリスト表示を行う - Qiita」という素晴らしい記事について、バージョンの違いなどにより執筆時点の環境ではうまくいかない部分を補足する記事です。参考記事とこの記事を使えば、参考記事のスクショ通りのアプリがとりあえず実装できることを執筆時点で確認してあります。
なお、この記事を使わずとも、エラーメッセージをちゃんと読み解いていけば実装できます。とはいえ、初心者だとどんなエラーなのか検討がつかず、1つ1つ時間をかけて調べていかなければならないと思いますし、途中で挫折してしまうかもしれません。それならば、参考記事とこの記事を使ってまずは実装してみたり、エラーメッセージと解決策との比較をどんどんしていったりした方が、速く習得できると思ったので記事を作りました。