美文网首页Android开发Android开发经验谈Android开发
一款仿VLayout的可嵌套RecyclerView框架

一款仿VLayout的可嵌套RecyclerView框架

作者: X_Sation | 来源:发表于2019-04-26 16:36 被阅读14次

    一款仿VLayout的可嵌套RecyclerView框架

    项目地址:https://github.com/XSation/SimpleNestList

    鸣谢 _

    https://github.com/alibaba/vlayout

    已实现的效果图

    以下只是暂时已经实现的几个布局,他们支持任意组合,搭配。相同类型的view之间支持互相复用。更重要的是扩展出新的布局也很简单,可以直接参考已经实现的效果去做。

    列表

    image.png

    网格

    image.png

    带title的网格

    image.png

    横跨view的独立控件

    image.png

    交错的网格(一个示例,具体可以根据自己产品需求自定义)

    image.png

    搭配起来的效果

    image.png

    什么地方需要用到该框架(当然用VLayout是首选,不过重复造轮子也没什么不好,重要的是学习知识点 _...)

    image.png
    image.png
    image.png
    image.png
    image.png

    优缺点

    • 对外暴露的api模仿VLayout实现,使用方式与VLayout一样简单。简化了开发步骤。
    • 相同类型的view之间支持互相复用。
    • 对于布局的实现,使用gridLayoutManager控制span实现。
      • 相较于VLayout:
        • 实现方式更low _
        • 不支持流式布局
        • 但也有好处:扩展容易,只需要继承LayoutHelper,实现几个方法即可,具体可参考layouthelper包下的几个类。
    • 目前已经实现的Layout:
      • LinearLayoutHelper 线性的,即类似于listView那样
      • GridLayoutHelper 网格型的,类似于GridView
      • TitleGridLayoutHelper title拖grid,可以实现类似于京东、淘宝、天猫搜索页面的筛选面板那样的布局。
      • SingleLayoutHelper 通栏型。 即放置一个控件,横向铺满屏幕。
      • 等等,具体以上面效果图为准
    • 关于itemShareType
      • 类似于VLayout的mHasConsistItemType变量。
      • 如果为ITEM_SHARE_TYPE_ALL类型,表示整个recyclerview中,所有的item,只要type相同,就可以彼此复用。然而这样也会引入一个问题,不同的子adapter,不好把控viewtype,可能出现两个子adapter中定义了相同的viewtype,但是他们的样式并不相同,这样就会出现显示的bug
        • 解决方案:对于ITEM_SHARE_TYPE_ALL类型,把onCreateViewHolder和getItemViewType定义为final,强制用户通过IShareAllTypeProvider接口定义type和创建viewholder。
      • 如果为ITEM_SHARE_TYPE_SUBADAPTER类型,表示对于每一个子adapter,都是一套独立的viewtype,开发起来就跟我们写一个最基本的adapter一样。
        • 用getItemViewTypeForSubAdapter和onCreateViewHolderForSubAdapter方法来代替原生方法
        • 目前暂未实现这种模式。

    数据操作、ui刷新

    目前支持:

    • 整个recyclerView一次性刷。简单粗暴。
    • 针对一个subAdapter刷。由于subAdapter的模块化开发。所以也很简单。同时效率也更好。
    • 不要使用Adapter官方提供的方法!!!不要使用Adapter官方提供的方法!!!不要使用Adapter官方提供的方法!!!

    如下:

    • 简单粗暴法。刷整个recyclerview
      • 修改任意一个subAdapter的数据源之后,可以调用delegateAdapter.simpleNotifyDataSetChanged来刷新,注意不是系统提供的notifyDataSetChanged方法
        • delegateAdapter.simpleNotifyDataSetChanged();
    • 略微粗暴法。
      • 刷一个subAdapter的小区域,目前只想到这种方法,并且必须要传入新旧数据源,没有好的思路保存这两数据源。大家有其他思路的可以提一提。
      • 使用默认的DiffCallback,即认为调用该方法,先移除,后新增,效率略低
        • categoryAdapter.simpleNotifyDataSetChanged(oldDatas, categoryBeans);
      • 使用自定义的DiffCallback,会根据数据源的变化情况来刷,效率略高
        • categoryAdapter.simpleNotifyDataSetChanged(oldDatas, categoryBeans,new DefaultDiffCallback<CategoryBean>(){// TODO: by xk 2019/4/25 下午3:56 实现各种自己的实现});
    • itemChanged
      • categoryAdapter.simpleNotifyItemChanged(1);
    • itemRemove
      • categoryAdapter.simpleNotifyItemRemoved(0);
    • itemMove
      • categoryAdapter.simpleNotifyItemMoved(2, 10);
    • itemInserted
      • categoryAdapter.simpleNotifyItemInserted(4);
    • itemRangeChanged
      • categoryAdapter.simpleNotifyItemRangeChanged(1,4);
    • itemRangeRemoved
      • categoryAdapter.simpleNotifyItemRangeRemoved(1,4);
    • itemRangeInserted
      • categoryAdapter.simpleNotifyItemRangeInserted(1,4);

    TODO

    • 可以利用ItemDecoration实现类似阿里的fix类型的布局。开发者同样使用adapter的形式使用,delegateadapter中把这种helper的subadapter过滤掉,单独处理。
    • 吸顶效果
    • 支持ITEM_SHARE_TYPE_SUBADAPTER
    • 针对subAdapter刷所有数据时,不需要传入新旧数据源(没有想到较好的办法去保存修改前后数据源)

    相关文章

      网友评论

        本文标题:一款仿VLayout的可嵌套RecyclerView框架

        本文链接:https://www.haomeiwen.com/subject/fodqnqtx.html