应用场景
新接到一个需求,统计商品列表中每个条目被用户观看的时间,从而来挖掘用户兴趣点。这个需求很常见,比如今日头条的新闻、简书的推荐文章、美团的推荐美食都需要统计用户在每个列表项上的视线停留时间。
去网上查了下,发现这方面的技术和文档却不多,友盟、TalkData等数据统计公司也没有提供解决方案,究其原因应该是暂时没找到通用的技术途径,于是只有自己研究了,现在把部分成果贴出来。
效果展示

功能概述
1 RecyclerView代码埋点检测用户观看每个Item时间,并实时显示;
2 RecyclerView无痕埋点检测用户观看每个Item时间,并实时显示。
基本原理解析
当一个Item开始显示记录时间,结束显示再记录一次时间,下面简单介绍下最关键的原理点。
代码中埋点
当RecyclerView addOnScrollListener之后便需要重写方法onScrolled,在这个方法里面我们可以获取到当前第一个显示的item和最后显示的item,那么我们选定item如果在这个之间并且屏幕亮便是在显示、否则没有显示。当外界条件变化、比如列表滚动、屏幕变暗就计算一次。把计算显示时间部分专门抽成一个类,界面显示出现变化,比如列表滚动时调用就重新计算一次显示时间,具体看源码。
非侵入式埋点
用AspectJ去织入onScrolled的代码。AspectJ是一种编译时候修改源码的方案,这样我们的业务代码就不受手工代码埋点的影响,相当于编译器帮助我们进行手工代码埋点。具体做法见源码。
难点
1 RecyclerView的区分;
2 RecyclerView item与内容的映射。
未来研究
1 如果RecyclerView没有重写方法onScrolled该如何采集;
2 RecyclerView 观看内容采集;
3 计算显示时间算法持续优化;
4 处于屏幕边缘以及被遮盖Item的显示时间获取。