Kotlin + Vlayout 写的 One 客户端 -- 适合入门

966 阅读1分钟
原文链接: www.jianshu.com

最近在学kotlin语言,虽然踩了一些坑,但是他的语法特性带给我的惊喜足以让我激动

正好天猫开源了vlayout框架,适用于复杂的recyclerview布局环境

因此把这两个用在了一起,做了个小demo,分享出来

整体代码不难,适合入门学习

Github链接

用到的框架

vlayout

retrofit

rxjava

截图


5CA91B973D8847E145801C3A499F3156.png
val layoutManger = VirtualLayoutManager(this)
    val recyclerview by lazy {
        find<RecyclerView>(R.id.recyclerview).apply {
            layoutManager = this@VActivity.layoutManger
            recycledViewPool = RecyclerView.RecycledViewPool()
                    .apply { setMaxRecycledViews(0, 20) }
        }
    }

把获取的列表拆分成三种假数据(为了测试vlayout)

val singleHelper = SingleLayoutHelper()
        singleHelper.setMargin(0,16,0,0)
        //顶部的小标题条目
        delegateAdapter.addAdapter(SimpleItemAdapter(this,singleHelper))

        val gridHelper = GridLayoutHelper(2)
        gridHelper.bgColor = Color.WHITE

        // 就是一个高阶函数
        api.getasList {
            // 把返回的数据分成三部分,用不同的布局展示
            it.forEachIndexed { index, dataBean ->
                when (index) {
                    in 0..10 -> {
                        list1.add(dataBean)
                        if (index == 10)
                            delegateAdapter.addAdapter(SubAdapter(this, gridHelper, list1))
                    }
                    in 11..20 -> {
                        list2.add(dataBean)
                        if (index == 20)
                            delegateAdapter.addAdapter(SubAdapter(this, StaggeredGridLayoutHelper(2), list2))
                    }
                    else -> {
                        list3.add(dataBean)
                        if (index == it.size-1)
                            delegateAdapter.addAdapter(SubAdapter(this, LinearLayoutHelper(), list3))
//                        delegateAdapter.notifyDataSetChanged()
                    }
                }
            }
        }

adapter的代码

class SubAdapter(val context: Context, val layoutHelper: LayoutHelper, val data: List<BeanListMonth.DataBean>) : DelegateAdapter.Adapter<SubAdapter.InfoViewHolder>() {

        override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): InfoViewHolder {

            val view = LayoutInflater.from(context).inflate(R.layout.item, parent,false)
            return InfoViewHolder(view)
        }

        override fun onBindViewHolder(holder: InfoViewHolder?, position: Int) {
            holder?.let {
                holder.infoTextView.text = data[position].hp_content
                holder.authorTextView.text = data[position].hp_author
                Glide.with(context).load(data[position].hp_img_url)
                        .asBitmap().error(R.drawable.one_pic)
                        .into(holder.imageView)
            }
        }

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

        override fun onCreateLayoutHelper(): LayoutHelper {
            return layoutHelper
        }

        class InfoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

            var cardView: CardView = itemView.findViewById(R.id.card_view) as CardView
            var imageView: ImageView = itemView.findViewById(R.id.image_one) as ImageView
            var infoTextView: TextView = itemView.findViewById(R.id.text_one) as TextView
            var authorTextView: TextView = itemView.findViewById(R.id.author) as TextView

        }

    }