blue928sky
@blue928sky

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

AndroidのRecyclerViewでレイアウトを分けて表示しているのですが、継承したViewHolder内のほぼ似たコードを基底クラスでまとめて関数化できないでしょうか?

解決したいこと

独学でAndroid・Kotlinでアプリ開発をしています。
タイトルの通り継承したクラスにほぼ同一のコードがあり、そのコードを基底クラスで関数化できるのか勉強不足のためわかりません。どなたかご教授願います。

実装している内容

MainAdapter.kt
class MainAdapter(
    val mViewModel: MainViewModel,
    private val frag: MainFragment
) :
    ListAdapter<Data, MainAdapter.ViewHolder>(ITEM_CALLBACK) {
    private val liveData = mViewModel.liveData

    // ...省略

    override fun onBindViewHolder(holder: ViewHolder, pos: Int) {
        val data = liveData.value?.get(pos) ?: Data()

        when (holder.itemViewType) {
            // グリッドレイアウト
            Layout.GRID.num -> {
                val view = holder as GridViewHolder
                view.bind(data, pos)
            }
            // リストレイアウト
            Layout.LIST.num -> {
                val view = holder as ListViewHolder
                view.bind(data, pos)
            }
        }
    }

    abstract class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        abstract fun bind(data: Data, pos: Int)
    }

    inner class GridViewHolder(val binding: GridItemBinding) : ViewHolder(binding.root) {
        // ====== ここから ===== //
        override fun bind(data: Data, pos: Int) {
            binding.run {
                viewModel = mViewModel
                this.data = data
                fragment = frag

                lifecycleOwner = parentLifecycleOwner
                executePendingBindings()
            }
        }
        // ====== ここまで ===== //
    }

    inner class ListViewHolder(val binding: ListItemBinding) : ViewHolder(binding.root) {
        // ====== ここから ===== //
        override fun bind(data: Data, pos: Int) {
            binding.run {
                viewModel = mViewModel
                this.data = data
                fragment = frag

                lifecycleOwner = parentLifecycleOwner
                executePendingBindings()
            }
        }
        // ====== ここまで ===== //
    }
}
0

No Answers yet.

Your answer might help someone💌