美文网首页
RecyclerView解析

RecyclerView解析

作者: Il_mondo | 来源:发表于2017-02-23 23:53 被阅读63次

RecyclerView作为最常用的控件... 唉,最近真心累,本来计划是每天一篇的...奈何太忙,先占个坑吧..这篇文章主要介绍RecycerView常见的效果,原理效少,慢慢等吧(。・`ω´・)

一、复杂布局

  • 用GridLayoutManager.setSpanSizeLookup方法实现.
    getSpanSize(int position) 返回值特点 :假设初始GridLayoutManager时构造中传入值为4,那么我们返回4的一半即(2/4)时显示两个条目,返回可以整除的值时显示一个条目,除不断时则返回默认显示条目数量.

利用条目类型加载不同的ViewHolder实现条目内容的不同,位置及数量的显示则由getSpanSize的返回值决定.

缺点:条目类型越多ViewHolder就越多,RecyclerView内部的判断就会越庸肿,如何将这些庸肿的判断剔除出来呢?

如何改进?

二、下拉加载

下拉加载不同数据,首先要做的就是判断条目位置,如何判断条目位置呢?

三、添加Head和Foot

在RecyclerView里添加头和脚不难,因为头与脚也可以看做成一种条目类型,所以加头加脚说白了也只是增加条目类型而以,除此外还有一个问题,那便是如果将布局插入指定位置,好在RecyclerView也有提供相应的方法实现.

面向过程的写法:

面向对象的写法:
考虑到在日后的工作中可能经常会遇到这样的需求,以硬编码的方式实现该功能,无疑耦合度过高,以后用到时都需要更改相应的方法,因此最好是将加头加脚的操作抽取出来。这里用装饰设计模式.

  • 装饰设计模式:

四、拖拽

  • ItemTouchHelper.Callback

    • int getMovementFlags (RecyclerView , viewHolder):条目的移动方式.

    • onMove():某个条目的位置移动时调用,回调后应该将原来条目位置移动新位置.

    • onSwiped():某个条目滑动时调用,根据getMoementFlags方法的返回值决定是否调用,一但开始滑动则会调用clearView方法.

    • isLongPressDragEnabled():决定是否可以拖拽.

    • onSelectedChanged(ViewHolder, int):在每次View Holder的状态变成拖拽 (ACTION_STATE_DRAG) 或者 滑动 (ACTION_STATE_SWIPE)的时候被调用。这是把你的item view变成激活状态的最佳地点

    • clearView(RecyclerView, ViewHolder):在一个view被拖拽然后被放开的时候被调用,同时也会在滑动被取消或者完成ACTION_STATE_IDLE)的时候被调用。这里是恢复item view idle状态的典型地方。

  • ItemTouchHelper

关系

五、仿ViewPage

现在用RecyclerView实现ViewPage的横向滚动很简单,官方提供了第三方的支持库,我们只需要将RecyclerView将由此库就可实现类似ViewPage的效果,代码如下:

new LinearSnapHelper().attachToRecyclerView(recyclerView);

效果图之所以会显示两边的条目,是因为我并没有将条目的宽度设置为match_parent,如果你只想显示单个条目只需要将宽度设置为match_parent即可,同理若想条目之间有间隔只需设置layout_margin属性.

5.1、添加动画效果

// ...

六、自定义ItemDecoration、ItemAnimator、LayoutManage

  • LayoutManage
    RecyclerView的缓存机制

相关文章

网友评论

      本文标题:RecyclerView解析

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