All Your Baseの日記

モバイルアプリを開発しています。

【Kotlin】RecyclerViewを実装する

f:id:ayb:20170923193107j:plain

KotlinでRecyclerViewを実装したのでメモ。怪しいところがあったら教えてくれると嬉しいです。

RecyclerViewの導入

app/build.gradleのdependenciesに1行追加。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.0.2'
    implementation 'com.android.support:recyclerview-v7:26.0.2'//追加
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

モデルクラスの作成

Kotlinのdataクラスを使ってモデルを作成。Kotlinは綺麗に書けて良いですね。

data class Chat(val text: String, val date: Date)

RecyclerViewの実装

こんな感じで実装しました。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.setHasFixedSize(true)

    //ダミーデータの挿入
    val data = ArrayList()
    data.add(Chat(false, getString(R.string.first), Date()))

    recyclerView.adapter = MyAdapter(data)
}

アダプターの実装

MainActivityのインナークラスとして実装しました。

internal class MyAdapter(var data : ArrayList): RecyclerView.Adapter() {

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder {
        val v: View = LayoutInflater.from(parent?.context).inflate(R.layout.chat_item, parent, false)
        return MyViewHolder(v)
    }

    override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
        holder?.textView?.text = data[position].text
    }

    override fun getItemCount(): Int = data.size

    fun add(chat: Chat) {
        data.add(chat)
    }

    internal class MyViewHolder(view: View): RecyclerView.ViewHolder(view) {
        val textView: TextView?

        init {
            textView = view.findViewById(R.id.text)
        }
    }
}

これで動くはず。