最近在学kotlin语言,虽然踩了一些坑,但是他的语法特性带给我的惊喜足以让我激动
正好天猫开源了vlayout框架,适用于复杂的recyclerview布局环境
因此把这两个用在了一起,做了个小demo,分享出来
整体代码不难,适合入门学习
用到的框架
vlayout
retrofit
rxjava
截图
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
}
}