Android 我们可以使用Kotlin';创建RecyclerView CustomViewHolder的高阶函数?

Android 我们可以使用Kotlin';创建RecyclerView CustomViewHolder的高阶函数?,android,android-recyclerview,kotlin,higher-order-functions,Android,Android Recyclerview,Kotlin,Higher Order Functions,我想创建一个helper方法,使在Android中设置一个新的RecyclerView变得非常容易。我使用这个助手类实现了这一点: class AirRv { companion object { fun initAndGetAdapter( rv : RecyclerView, layoutManager: RecyclerView.LayoutManager, view

我想创建一个helper方法,使在Android中设置一个新的RecyclerView变得非常容易。我使用这个助手类实现了这一点:

class AirRv {

    companion object {

        fun initAndGetAdapter(
                rv : RecyclerView,
                layoutManager: RecyclerView.LayoutManager,
                viewLayout: Int,
                viewHolder: (view: View) -> RecyclerView.ViewHolder,
                bindView: (viewHolder: RecyclerView.ViewHolder, position: Int) -> Unit,
                size: () -> Int
        ): RecyclerView.Adapter<RecyclerView.ViewHolder>
        {
            return initAndGetAdapter(
                    rv,
                    layoutManager,
                    {
                        0
                    },
                    {
                        viewLayout
                    },
                    fun(view: View, viewType: Int) : RecyclerView.ViewHolder {
                        return viewHolder(view)
                    },
                    fun(viewHolder: RecyclerView.ViewHolder, viewType: Int, position: Int) {
                        bindView(viewHolder, position)
                    },
                    { size.invoke() }
            )
        }

        fun initAndGetAdapter(
                rv: RecyclerView,
                layoutManager: RecyclerView.LayoutManager,
                viewType: (position: Int) -> Int,
                viewLayout: (viewType: Int) -> Int,
                viewHolder: (view: View, viewType: Int) -> RecyclerView.ViewHolder,
                bindView: (viewHolder: RecyclerView.ViewHolder, viewType: Int, position: Int) -> Unit,
                size: () -> Int

        ): RecyclerView.Adapter<RecyclerView.ViewHolder>
        {
            val rvAdapter = object : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

                override fun getItemViewType(position: Int): Int {
                    return viewType(position)
                }

                override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
                    val view = LayoutInflater.from(rv.context).inflate(viewLayout(viewType), parent, false)
                    return viewHolder(view, viewType)
                }

                override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
                    bindView(holder, viewType(position), position)
                }

                override fun getItemCount(): Int {
                    return size()
                }

            }

            rv.layoutManager = layoutManager
            rv.adapter = rvAdapter
            return rvAdapter
        }

    }

}
这个很好用。但我能否改进这一点:

RvViewHolder(视图)
(第6行)

封闭函数所做的就是传递视图并检索相应的viewHolder。使用Kotlin的高阶函数,是否不可能以某种方式接收函数定义,以便帮助器方法可以创建实例并在内部执行必要的操作以获取相应的viewHolder

此助手函数的最终用户(程序员)不应手动执行此操作。当助手库给他一个视图时,用户将返回一个viewHolder,这是可以预见的。为什么程序不能在内部执行


如果有人能解释一下这件事,那将不胜感激。

如果有一种方法可以操作泛型类型

哦,等等。有,这叫做泛型

配套函数的签名应如下所示:

fun <T> initAndGetAdapter(
                rv : RecyclerView,
                layoutManager: RecyclerView.LayoutManager,
                viewLayout: Int,
                viewHolder: (view: View) -> T,
                bindView: (viewHolder: T, position: Int) -> Unit,
                size: () -> Int
): RecyclerView.Adapter<T>
2005年的那些家伙肯定知道他们在做什么

记住,我没有您的完整代码,所以您必须在运行过程中进行一些调整

您可以在Kotlin中阅读有关泛型的更多信息

fun <T> initAndGetAdapter(
                rv : RecyclerView,
                layoutManager: RecyclerView.LayoutManager,
                viewLayout: Int,
                viewHolder: (view: View) -> T,
                bindView: (viewHolder: T, position: Int) -> Unit,
                size: () -> Int
): RecyclerView.Adapter<T>
fun <T> initAndGetAdapter(
            rv: RecyclerView,
            layoutManager: RecyclerView.LayoutManager,
            viewType: (position: Int) -> Int,
            viewLayout: (viewType: Int) -> Int,
            viewHolder: (view: View, viewType: Int) -> T,
            bindView: (viewHolder: T, viewType: Int, position: Int) -> Unit,
            size: () -> Int

): RecyclerView.Adapter<T>
val adapter = AirRv.initAndGetAdapter(
        rv,
        LinearLayoutManager(""),
        1,
        fun(view: View) : RvViewHolder {
            return RvViewHolder(view)     // NOTICE THIS LINE
        },
        fun(viewHolder: RvViewHolder, position: Int) {
            val rvViewHolder = viewHolder // No as RvViewHolder anymore
        },
        { arrayList.size }
)