RecycleView学习笔记

最近开始学习RecyclerView,总结了一些我自己觉得需要关注有那么点实用的点,跟大家分享一下。以备不时之需。也许你早就了解了。那就当复习复习吧。知识在于积累,学习,总结,分享,讨论。不管大小深浅,总结才能纳为己用。请笑纳咯。

RecyclerView.Adapter

Adapter的作用有两个:1. 填充数据 2. 给每一个Item创建正确的布局。

RecyclerView.Adapter

  • public VH onCreateViewHolder(ViewGroup parent, int viewType) //return 一个ViewHolder对象
  • public void onBindViewHolder(VH holder, int position) 通过ViewHolder给布局填充数据
  • public int getItemCount() 获取数据总数

RecyclerView设置分割线的方法

  • 如果不需要特殊的效果,则直接给item设置margin。- 如果要比较复杂的分割线效果,则给RecyclerView设置itemDecoration

RecyclerView的点击事件
RecyclerView本身没有点击事件,需要在适配器中给子view添加click监听,然后调用我们自己的回调来实现。有关点击事件的实现可以参考我的另一篇文章RecyclerView --onItemClick设置汇总

getItemOffsets()

getItemOffsets相当于padding,相当于设置了相对于内容的上下左右的padding,padding出来的地方就是给onDraw方法来填充的。

getDraw绘制在内容的下一层相当于内容的背景。
getDrawOver绘制在内容的上一层,覆盖在内容上面,可以用于标签的绘制。

findChildViewUnder(int x, int y)

获取对应X,Y的view。可用于onInterceptTouchEvent里面用于判断当前触摸的view。

删除,添加数据

注意: RecyclerView的adapter刷新是不能用notifyDataChanged而是根据删除和插入数据调用不同的方法。
删除数据之后,通知adapter刷新数据的方法是notifyItemRemoved(int position).
添加数据之后,用notifyItemInserted(position)

ItemAnimator

ItemAnimator用于RecyclerView的item的切换动画。

SimpleItemAnimator

方法解读:

  • animateRemove(ViewHolder holder)
    当一个item要从RecyclerView中移除时,调用,而且在移除之后必须调用dispatchRemoveFinished(ViewHolder)。

getPositionByView

根据View获取当前View所在的position。

private int getPositionByView(View view) {
        if (view == null) {
            return NO_POSITION;
        }
        LayoutParams params = (LayoutParams) view.getLayoutParams();
        if (params == null || params.isItemRemoved()) {
            // when item is removed, the position value can be any value.
            return NO_POSITION;
        }
        return params.getViewPosition();
    }

requestChildFocus

requestChildFocus是当一个子布局要获取焦点的时候调用。源码注释如下:

 /**
     * Called when a child of this parent wants focus
     * 
     * @param child The child of this ViewParent that wants focus. This view
     *        will contain the focused view. It is not necessarily the view that
     *        actually has focus.
     * @param focused The view that is a descendant of child that actually has
     *        focus
     */
    public void requestChildFocus(View child, View focused);

从上面的英文注释我们可以知道当这个父布局的某个子布局要获取焦点的时候这个方法就会调用。注意,也有可能是该子布局中的子布局要获取焦点。第一个参数是父布局对应的子布局, 第二个参数才是真正获取焦点的view。从这个方法我们也可以获取到当前获取焦点的view的位置相关的信息。

  Log.i("xxx", "getPositionByView(child)" + getPositionByView(child) + focused );
     

LinearLayoutManager

有时候我们需要获取当前布局完整看到的第一个item,以及完整看到的最后一个item。因为有时候虽然RecyclerView我们看到的只有五个,但是其实获取第一个可见的item的position和我们预期的position不是同一个,这是因为有一些item虽然没有被我们看到,但是它对于布局来说是可见的,只不过也许他只是没有显示内容只显示了边缘,我们就认定不可见。这个时候我们就需要通过坐标来获取到完全可见的item。幸运地是,刚好LinearLayoutManager里面提供了相应的方法。

获取最后一个完整可见的item的position,注意是完整可见的item的position哦。

 /**
     * Returns the adapter position of the last fully visible view. This position does not include
     * adapter changes that were dispatched after the last layout pass.
     * <p>
     * Note that bounds check is only performed in the current orientation. That means, if
     * LayoutManager is horizontal, it will only check the view's left and right edges.
     *
     * @return The adapter position of the last fully visible view or
     * {@link RecyclerView#NO_POSITION} if there aren't any visible items.
     * @see #findLastVisibleItemPosition()
     * @see #findFirstCompletelyVisibleItemPosition()
     */
    public int findLastCompletelyVisibleItemPosition() {
        final View child = findOneVisibleChild(getChildCount() - 1, -1, true, false);
        return child == null ? NO_POSITION : getPosition(child);
    }  

获取第一个完整可见的item的position,注意是完整可见的item的position哦。

     /**
     * Returns the adapter position of the first fully visible view. This position does not include
     * adapter changes that were dispatched after the last layout pass.
     * <p>
     * Note that bounds check is only performed in the current orientation. That means, if
     * LayoutManager is horizontal, it will only check the view's left and right edges.
     *
     * @return The adapter position of the first fully visible item or
     * {@link RecyclerView#NO_POSITION} if there aren't any visible items.
     * @see #findFirstVisibleItemPosition()
     * @see #findLastCompletelyVisibleItemPosition()
     */
    public int findFirstCompletelyVisibleItemPosition() {
        final View child = findOneVisibleChild(0, getChildCount(), true, false);
        return child == null ? NO_POSITION : getPosition(child);
    }

RecyclerView在TV上的使用

RecyclerView在TV上面使用时,要保证子布局可以获取焦点否则上下键按键时布局无法移动!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,275评论 25 707
  • 简介: 提供一个让有限的窗口变成一个大数据集的灵活视图。 术语表: Adapter:RecyclerView的子类...
    酷泡泡阅读 5,133评论 0 16
  • 一、概述 对于RecyclerView的学习,主要是需要掌握以下几点: 数据:Adapter 使用:Recycle...
    泽毛阅读 7,251评论 1 23
  • Tangram是阿里出品、用于快速实现组合布局的框架模型,在手机天猫Android&iOS版 内广泛使用 该框架提...
    wintersweett阅读 3,241评论 0 1
  • 自从那次相遇 你就藏起了我的羽翼 在我的周围,野花开遍了山岗 湖水清澈,天空蔚蓝 而你的眼是深深的潭 你这温柔的救...
    风之子的黄昏阅读 295评论 13 10