博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Recycleview实现复杂布局
阅读量:7113 次
发布时间:2019-06-28

本文共 3045 字,大约阅读时间需要 10 分钟。

Recycleview实现复杂布局

首先 附上Demo链接和效果供大家参考

image

  • 实现思路
  • 代码思考

时间是一切财富中最宝贵的财富。 —— 德奥弗拉斯多

实现思路

开始看到设计稿子的时候,就在考虑这种参差不齐的布局。是不是有得考虑对数据的重新组装和计算每个空白区域的位置等等,因为之前做过类似的补空白的item。但感觉这个要是算起来会更加复杂 就在考虑有没有比较简单的实现思路

  1. 首先我想到了用嵌套的方式去实现,但是那样的话,性能会受到很大的影响。因为UI上滑动的卡顿,是我们最不想见到的情况了。
  2. 经过和朋友的交流,他之前实现过类似得。不过我也抛弃他的做法。因为觉得他的也很复杂,感觉比较难维护
  3. 不过受到他的一些启发,最后通过对数据的处理和实现一个核心方法,实现了最终的效果

    核心代码

    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
() { var list = arrayListOf
() fun update(list: ArrayList) { 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
(R.id.normal_tv)} class YearHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var tv = itemView.findViewById
(R.id.tv)}

代码思考

由于之前是Java写的,最近在学习Kotlin。个人感觉多学习一些东西还是比较好的。社会在进步嘛,如果赶不上时代的步伐,就会被淘汰,尤其是在中国。

说了那么多没用的,最后还是希望大家能够在码农的道路上越走越远,前辈请多指教。

转载于:https://www.cnblogs.com/zhaoyinglong/p/8934108.html

你可能感兴趣的文章
详解CALayer 和 UIView的区别和联系
查看>>
eclipse中报错:java.lang.OutOfMemoryError: Java heap space
查看>>
Ubuntu 16.04 grub rescue 模式下修复 grub
查看>>
【Spring】24、<load-on-startup>0</load-on-startup>配置
查看>>
L0 Regularization
查看>>
使用JDBC向Kudu表插入中文数据乱码(转载)
查看>>
spf13-vim安装与使用
查看>>
字体颜色代码表
查看>>
hdu 2156 分数矩阵
查看>>
android SQLite数据库应用于草稿箱
查看>>
Android 无缝换肤深入了解与使用
查看>>
Cordova快速开始(安卓篇)
查看>>
ActiveMQ
查看>>
聚类算法(kmeans)详解和python实现
查看>>
四种遍历方法你选哪个?
查看>>
LeetCode41.缺失的第一个正数 JavaScript
查看>>
Java设计模式五——单件模式
查看>>
奇怪的 Ruby
查看>>
79. Word Search
查看>>
【Android】RxJava的使用(四)线程控制 —— Scheduler
查看>>