Android RecyclerView Adapter View Bindingの適用


Activityはすべてビューバインディングを適用し,RecyclerView部分は初期にファイルのコピーと貼り付けを繰り返し,すべてfindViewByIdを適用した.(;´д`)ゞ
🙋🏻‍♀️ 空気入りとは何ですか.
xmlに表示されるレイアウトをメモリにオブジェクト化

💻 findViewByIdを適用するコード

class ReviewPhotoAdapter(val callback: (String) -> Unit) :
    ListAdapter<String, ReviewPhotoAdapter.ViewHolder>(diffUtil) {

    inner class ViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
        fun bind(item: String) {
            val reviewImageView = view.findViewById<ImageView>(R.id.reviewImageView)

            Glide.with(TestApp.instance)
                .load(item)
                .error(R.drawable.ic_person)
                .into(reviewImageView)

            reviewImageView.setOnClickListener {
                callback(item)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(R.layout.item_review_photo, parent, false)
        )
    }
    
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        return holder.bind(currentList[position])
    }

    companion object {
        val diffUtil = object : DiffUtil.ItemCallback<String>() {
            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
                return oldItem == newItem
            }

            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
                return oldItem == newItem
            }
        }
    }
}
上のコードは簡単なコードで、複雑ではないように見えますが、大量のビューのレイアウトを接続するとfindViewByIdに倍増します.これは話題です.😅 したがって、RecylerViewセクションでは、ビューバインドをすべて適用することも決定されます.

💻 View Bindingのコードの適用

class ReviewPhotoAdapter(val callback: (String) -> Unit) :
    ListAdapter<String, ReviewPhotoAdapter.ViewHolder>(diffUtil) {

    inner class ViewHolder(private val binding: ItemReviewPhotoBinding) :
        RecyclerView.ViewHolder(binding.root) {

        fun bind(item: String) {
            Glide.with(TestApp.instance)
                .load(item)
                .error(R.drawable.ic_person)
                .into(binding.reviewImageView)

            binding.reviewImageView.setOnClickListener {
                callback(item)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            // ItemReviewPhotoBinding 클래스로 만들어지는 binding 인스턴스를 사용하도록 변경
            ItemReviewPhotoBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        return holder.bind(currentList[position])
    }

    companion object {
        val diffUtil = object : DiffUtil.ItemCallback<String>() {
            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
                return oldItem == newItem
            }

            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
                return oldItem == newItem
            }
        }
    }
}

View Bindingを使うメリットは何ですか?


コードも簡潔な利点がありますが、findViewByIdは人が直接作成して接続しているので、乱発するとエラーが発生するのは避けられません…!エラーなしでビューをエラーの部分に接続Android 4.1以前のバージョンでは、Kotlin拡張機能のため、findViewById<ⓐ>(R.id.reviewImageView)を省略することもあり、他のxmlファイルのidと同じであれば、対応するビューが見つからずアプリケーションがハングアップする場合があります.最終的にはバインドされたxmlファイルでしかIDが見つからないので、「ビューバインド」(View Binding)が最適です.👍🏻