如何利用 Anko 扩展 RecyclerView 或 Custom View

前言

 Anko 作为 jetbrain 同时推出的辅助 kotlin 的神兵利器,可以使用 DSL 语言来快速的完成 android 布局。
 从此可以完全抛弃 xml了。anko 默认扩展了LinearLayout(verticalLayout,没有 horizontalLayout,可以使用 orientation 来定义),relativeLayout 等,
 但对于 RecyclerView 或者 自定义的 View 没有支持。

所以想要在代码中使用他们,就需要 anko extension,这里简单的扩展一下 RecyclerView

1.添加依赖

compile 'com.android.support:recyclerview-v7:$support_version'
// Anko Layouts
compile "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
// Coroutine listeners for Anko Layouts(可以在 DSL 中直接使用协程)
compile "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
compile "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"

2. 扩展

inline fun ViewManager.recyclerView() = RecyclerView(Application.instance,null,-1)
inline fun ViewManager.recyclerView(init: RecyclerView.() -> Unit): RecyclerView {
 return ankoView({RecyclerView(Application.instance,null)},0,init)
}

ViewManager 是 package android.view; 中的一个 interface:

interface to let you add and remove child views to an activity: 一个可以向 activity 中添加删除 view 的接口
如何利用 Anko 扩展 RecyclerView 或 Custom View_第1张图片
ViewManager继承树.png

然后通过 ankoView 来创建 View

如何利用 Anko 扩展 RecyclerView 或 Custom View_第2张图片
ankoview.png

3.食用

val items = arrayListOf()
        items.add("OneRepublic")
        items.add("LinkinPark")
        items.add("ColdPlay")
        items.add("Maroon5")
        items.add("ImageDragon")
recyclerView {
                layoutManager = LinearLayoutManager(this@LayoutActivity)
                adapter = myAdapter(items)
                (adapter as myAdapter).setOnItemClcickListener(object : myAdapter.OnItemClickListener {
                    override fun onItemClicked(v: View, position: Int) {
                        toast(items[position])
                    }

                })

            }.lparams(width = matchParent) {
                height = matchParent
    }
/**
 * adapter for recycler
 */
class myAdapter(val items: ArrayList?) : RecyclerView.Adapter() {

    override fun onBindViewHolder(holder: myHolder?, position: Int) {
        val tv = holder?.itemView as TextView
        tv.text = items!![position]
        tv.onClick { mOnItemClcickListener!!.onItemClicked(it!!, position) }
    }

    override fun getItemCount(): Int {
        return items?.size ?: 0
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): myHolder {
        val tv = TextView(parent?.context)
        tv.gravity = Gravity.CENTER
        tv.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
        tv.padding = parent?.context!!.dip(10)
        tv.textSize = parent?.context!!.sp(24).toFloat()
        tv.textColor = Color.RED
        return myHolder(tv)
    }

    fun setOnItemClcickListener(listener: OnItemClickListener) {
        mOnItemClcickListener = listener
    }

    interface OnItemClickListener {
        fun onItemClicked(v: View, position: Int)
    }

    var mOnItemClcickListener: OnItemClickListener? = null

    inner class myHolder(itemView: View?) : RecyclerView.ViewHolder(itemView)
}

4.大功告成

5.多说一句,话说jake wharton 大神终于去 google了,发推表示已进入 framework 工作团队,并且会继续进行 kotlin 研究。看来 google 爸爸这是要和 java 决裂的节奏,说不定以后 kotlin 将完全取代 android 中 的java/c/c++。安卓java开发者且行且珍惜。

你可能感兴趣的:(如何利用 Anko 扩展 RecyclerView 或 Custom View)