Recycleview实现复杂布局
Posted zhaoyinglong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Recycleview实现复杂布局相关的知识,希望对你有一定的参考价值。
Recycleview实现复杂布局
首先 附上Demo链接和效果供大家参考
Demo
- 实现思路
- 代码思考
时间是一切财富中最宝贵的财富。 —— 德奥弗拉斯多 <a
实现思路
开始看到设计稿子的时候,就在考虑这种参差不齐的布局。是不是有得考虑对数据的重新组装和计算每个空白区域的位置等等,因为之前做过类似的补空白的item。但感觉这个要是算起来会更加复杂 就在考虑有没有比较简单的实现思路
- 首先我想到了用嵌套的方式去实现,但是那样的话,性能会受到很大的影响。因为UI上滑动的卡顿,是我们最不想见到的情况了。
- 经过和朋友的交流,他之前实现过类似得。不过我也抛弃他的做法。因为觉得他的也很复杂,感觉比较难维护
不过受到他的一些启发,最后通过对数据的处理和实现一个核心方法,实现了最终的效果
核心代码
1.对后台返回的数据进行在整合,类型划分
class Data { var type: Int? = 0 var kname: String? = "" var year: String? = "" }
2.重写Recycleview的onAttachedToRecyclerView方法,对返回的列的数量进行区分
override fun onAttachedToRecyclerView(recyclerView:RecyclerView?) { super.onAttachedToRecyclerView(recyclerView) (recyclerView!!.layoutManager as GridLayoutManager).spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return if (list[position].type == ITEMTYPE.ITEM_YEAR.ordinal) { 2 } else { 1 } } } }
3.adapter里具体代码实现
class XAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() { var list = arrayListOf<Data>() fun update(list: ArrayList<Data>) { this.list.clear() this.list.addAll(list) notifyDataSetChanged() }
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { return if (viewType == ITEMTYPE.ITEM_YEAR.ordinal) { YearHolder(LayoutInflater.from(parent!!.context).inflate(R.layout.item_year, null)) } else { NormalHolder(LayoutInflater.from(parent!!.context).inflate(R.layout.item_normal, null)) } }
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { if (list[position].type == ITEMTYPE.ITEM_YEAR.ordinal) { (holder as YearHolder).tv.text = list[position].year } else { (holder as NormalHolder).normal_tv.text = list[position].kname } } override fun getItemCount(): Int { return list.size } override fun getItemViewType(position: Int): Int { return list[position].type!! }
```
override fun onAttachedToRecyclerView(recyclerView: RecyclerView?) {
super.onAttachedToRecyclerView(recyclerView)
(recyclerView!!.layoutManager as GridLayoutManager).spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if (list[position].type == ITEMTYPE.ITEM_YEAR.ordinal) {
2
} else {
1
}
}
}
}
}
class NormalHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var normal_tv = itemView.findViewById<TextView>(R.id.normal_tv)
}
class YearHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var tv = itemView.findViewById
代码思考
由于之前是Java写的,最近在学习Kotlin。个人感觉多学习一些东西还是比较好的。社会在进步嘛,如果赶不上时代的步伐,就会被淘汰,尤其是在中国。
说了那么多没用的,最后还是希望大家能够在码农的道路上越走越远,前辈请多指教。
以上是关于Recycleview实现复杂布局的主要内容,如果未能解决你的问题,请参考以下文章
Android开发游记:RecycleView 实现复杂首页布局三种方式
同一页面实现recycleView三种布局recycleView + adapter