通过DSL的方式创建RecyclerView 的Adapter


#1

大家好,我最近学习了Kotlin这个语言,发现里面支持的DSL功能很好用,于是写了一个用DSL方式创建Adapter的工具。欢迎各位批评指正。
git Hub地址:https://github.com/luuillu/DslAdapter

这个工具创建布局的方式与Anko类似,不过Anko支持Dsl的方式是对每个View单独包装了一遍,这会导致两个问题:

  1. 封装后的View方法、属性与原有View有差异,会增加学习成本,
  2. 自定义View需要写额外的的代码适配Anko

这个库用泛型实现Dsl,不需对已存在的View进行额外的包装,可以直接使用,从而解决了这个问题。

一个创建Adapter的例子:

/*
* Adapter所关联的数据类型由DslAdapter的泛型参数决定。
*/
val adapter = DslAdapter<Pair<String, Int>>().also {  

            /*
           * 创建ViewHolder对应的布局, 泛型参数表示要需要创建的View的类型
           * 后面紧跟的lambda表达式是一个扩展函数, receive type是泛型参数代表的View类型。
           * 所以可以在lambda表达式中对创建出来的View做一些初始化操作。
           */
            it<LinearLayout> {

                /*
                * 此处的it代表DslBindableInflater对象,它是一个辅助创建布局的工具类。
                * 主要有三个功能:
                *
                * 1.it<ViewType>{} : 这个方法建一个childView,然后执行后面的lambda表达式初始化child,
                * 最后把child添加到自己的view中。
                *
                * 2.调用it.layoutParams{} 可以方便设置layoutParams,每个ViewGroup对应不同类型的LayoutParam,
                * 调用这个方法可以根据上下文关系,自动推导出正确的LayoutParam类型。
                *
                * 3.it.onBind{} 这个方法在Adapter执行onBind 的时候被调用,
                * 可以这个方法中得到这个item关联的数据,然后把数据展示出来
                */
                it.layoutParams {
                    width = MATCH_PARENT
                }

                orientation = HORIZONTAL

                //创建一个TextView对象,并添加到LinearLayout中
                it<TextView> {

                    it.layoutParams {
                        width = 0
                        weight = 1f
                    }

                    it.onBind {
                        text = it.first
                    }
                }

                it<TextView> {

                    it.layoutParams {
                        width = 0
                        weight = 1f
                    }

                    it.onBind {
                        text = it.second.toString()
                    }
                }
            }
        }

京ICP备16022265号-2 Kotlin China 2017 - 2018