All Your Baseの日記

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

【Kotlin】RecyclerViewのレイアウトを動的に切り替える

f:id:ayb:20171008094929j:plain

動的にというのかどうかわかりませんが、RecyclerViewのレイアウトを切り替えながら使いたい時があると思うのでそのためのメモ。

getItemViewType をオーバーライドして、ViewTypeを変更する処理を書きます。ViewTypeはInteger型です。そのあと、onCreateViewHolderにviewTypeが渡されてくるので、ここでviewTypeに応じてレイアウトを切り替えてあげればOKです。

internal class MyAdapter(var data : ArrayList<Chat>): RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder {
        when(viewType) {
            0 -> return MyViewHolder(LayoutInflater.from(parent?.context).inflate(R.layout.chat_user, parent, false))
            else -> return MyViewHolder(LayoutInflater.from(parent?.context).inflate(R.layout.chat_bot, parent, false))
        }
    }

    override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
        //省略
    }

    override fun getItemCount(): Int = data.size

    override fun getItemViewType(position: Int): Int {
        return if(data.get(position).isUser) 0 else 1
    }

    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)
        }
    }
}