Recycleview实现复杂布局

Recycleview实现复杂布局

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

Demo

  • 实现思路
  • 代码思考

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

实现思路

开始看到设计稿子的时候,就在考虑这种参差不齐的布局。是不是有得考虑对数据的重新组装和计算每个空白区域的位置等等,因为之前做过类似的补空白的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<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。个人感觉多学习一些东西还是比较好的。社会在进步嘛,如果赶不上时代的步伐,就会被淘汰,尤其是在中国。

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

原文地址:https://www.cnblogs.com/zhaoyinglong/p/8934108.html

时间: 2024-11-07 15:22:53

Recycleview实现复杂布局的相关文章

手把手教你给RecycleView添加头布局和尾布局

RecycleView想必大家都不陌生,它已他的高拓展性取代了传统布局显示,同时配合协调布局,可以实现很多意想不到的酷炫交互,今天就和大家介绍一下,如何给RecycleView添加头布局和尾布局,同时你也可以通过自己的拓展实现更多复杂的布局. 首先我们先看一下效果: 实现头部尾部布局其实方法还是很多,这里我推荐使用Adapter设置itemType来做,那么问题来了,为什么这么做呢?因为拓展性更强,并且更加解耦.将逻辑都写在adapter中,比起写在activity中管理起来也更加方便. 首先,

RecycleView 实现多布局

最近的一个新需求,简单描述下吧: 需求: 目标样式如图所示,我们需要根据需求动态添加网关和设备. 目标有了下面就是怎么实现了.首先我们选用的是RecycleView 那么主要目标就成了 在recycleView下如何实现多布局(我们看到网关和设备的布局不同) 首先写两个布局(一个网关 , 一个设备) 网关布局样式: 设备布局样式: 这些都比较简单,在这里就不赘述. RecycleView的基本用法: 1)引入包 2)在布局中使用控件 3)在activity中绑定并使用recycleView 4)

Android Studio第二十七期 - RecycleView不同item布局

其实就是适配器的写法~ (附:copy loader的~剪刀手~) DemoDifferentRecycleViewAdapter: package com.haiersmart.sfnation.demo.adapter; import android.content.Context; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.support.v7

RecycleView的多布局

---恢复内容开始--- 1.首先在适配器定义一个枚举: public enum ITEM_TYPE { ITEM1, ITEM2} 2.然后在 OnCreatedViewHoler中这样写 @Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ITEM_TYPE.ITEM1.ordinal()) { return new Item1

HeaderRecycleAdapter--通用的带头部RecycleView.Adapter

目录 概述 HeaderRecycleViewAdapter这是一个通用的RecycleView.Adapter,可以不需要继承即可简单的使用.此Adapter实现了带头部的处理显示,不需要使用头部显示时可以使用其简单版本SimpleRecycleViewAdapter. 适用范围 任何类型的数据 支持LinearLayoutManager及GridLayoutManager 支持竖直方向及横向方向 暂时不支持reverseLayout,即反方向布局 其它 对于文中提到一些不太能马上理解的点,后

Android开发RecycleView的使用全解

RecycleView 简介: RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recylerview即回收view也可以看出. 优点及作用: 根据官方的介绍RecylerView是ListView的升级版,既然如此那RecylerView必然有它的优点,现就RecylerView相对于ListView的优点罗列如下: RecylerView封装了viewholder的回收复用,也就是说

RecycleView设置顶部分割线(记录一个坑)

大家都知道,想给RecycleView设置分割线可以重写RecyclerView.ItemDecoration 项目过程中,遇到一个需求:RecycleView顶部有一条灰色的间隔,我想到了给RecycleView设置分割线的方法,当然只给第一个Item设置,而且在上方. public class MyDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; /** * Custo

【翻译】Android RecyclerView CardView

Android L最新支持包推出两个UI控件RecycleView和CardView.RecyclerView是更先进,更灵活的ListView,这是一个很大的进步,因为ListView是UI组件中最常用的控件之一.此外,CardView控件是一个全新的组件.在这篇教程中将解释如何使用这两个控件以及如何混合使用它们,首先来来深入了解一下RecyclerView. RecyclerView 正如前面说RecyclerView是更加灵活的ListView,尽管它引进了一些复杂的东西.我们都知道如何在

拆解轮子之XRecyclerView

简介 这个轮子是对RecyclerView的封装,主要完成了下拉刷新.上拉加载更多.RecyclerView头部.在我的Material Design学习项目中使用到了项目地址,感觉还不错.趁着毕业答辩还有2个星期,先把这个轮子拆了看看,这个项目地址在XRecyclerView,先贴个效果图,更多效果图请进入项目中查看. 使用 使用起来也比较简单,首先向普通RecyclerView那样: LinearLayoutManager layoutManager = new LinearLayoutMa