一、概要

100行代码实现recyclerview条目曝光埋点设计

二、设计思路

  1. 条目露出来一半以上视为该条目曝光。
  2. 在rv滚动过程中或者数据变更回调OnGlobalLayoutListener时,将符合条件1的条目记录在曝光列表、上传埋点集合里。
  3. 滚动状态变更和OnGlobalLayoutListener回调时,且列表状态为idle状态,触发上报埋点。

三、容错性

  1. 滑动过快时,视为未曝光
  2. 数据变更时,重新检测曝光
  3. 曝光过的条目,不会重复曝光

四、接入影响

  1. 对业务代码零侵入
  2. 对列表滑动体验无影响

五、代码实现

import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import java.util.*class RVItemExposureListener(private val mRecyclerView: RecyclerView,private val mExposureListener: IOnExposureListener?
) {interface IOnExposureListener {fun onExposure(position: Int)fun onUpload(exposureList: List<Int>?): Boolean}private val mExposureList: MutableList<Int> = ArrayList()private val mUploadList: MutableList<Int> = ArrayList()private var mScrollState = 0var isEnableExposure = trueprivate var mCheckChildViewExposure = trueprivate val mViewVisible = Rect()fun checkChildExposeStatus() {if (!isEnableExposure) {return}val length = mRecyclerView.childCountif (length != 0) {var view: View?for (i in 0 until length) {view = mRecyclerView.getChildAt(i)if (view != null) {view.getLocalVisibleRect(mViewVisible)if (mViewVisible.height() > view.height / 2 && mViewVisible.top < mRecyclerView.bottom) {checkExposure(view)}}}}}private fun checkExposure(childView: View): Boolean {val position = mRecyclerView.getChildAdapterPosition(childView)if (position < 0 || mExposureList.contains(position)) {return false}mExposureList.add(position)mUploadList.add(position)mExposureListener?.onExposure(position)return true}private fun uploadList() {if (mScrollState == RecyclerView.SCROLL_STATE_IDLE && mUploadList.size > 0 && mExposureListener != null) {val success = mExposureListener.onUpload(mUploadList)if (success) {mUploadList.clear()}}}init {mRecyclerView.viewTreeObserver.addOnGlobalLayoutListener {if (mRecyclerView.childCount == 0 || !mCheckChildViewExposure) {return@addOnGlobalLayoutListener}checkChildExposeStatus()uploadList()mCheckChildViewExposure = false}mRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {override fun onScrollStateChanged(recyclerView: RecyclerView,newState: Int) {super.onScrollStateChanged(recyclerView, newState)mScrollState = newStateuploadList()}override fun onScrolled(recyclerView: RecyclerView,dx: Int,dy: Int) {super.onScrolled(recyclerView, dx, dy)if (!isEnableExposure) {return}// 大于50视为滑动过快if (mScrollState == RecyclerView.SCROLL_STATE_SETTLING && Math.abs(dy) > 50) {return}checkChildExposeStatus()}})}
}

六、使用

RVItemExposureListener(yourRecyclerView, object : RVItemExposureListener.IOnExposureListener {override fun onExposure(position: Int) {// 滑动过程中出现的条目Log.d("exposure-curPosition:", position.toString())}override fun onUpload(exposureList: List<Int>?): Boolean {Log.d("exposure-positionList", exposureList.toString())// 上报成功后返回truereturn true}})

完结,撒花

Android实战——RecyclerView条目曝光埋点相关推荐

  1. 深入浅出:移动端(Android 和 iOS)数据采集埋点 SDK

    随着大数据时代的到来,越来越多公司注意到数据带来的价值,开始自建或购买一些第三方的数据平台.从数据流的角度看,平台对于数据的处理,一般有以下几个步骤: 其中,数据采集工作是后面几个步骤的基础,数据采集 ...

  2. Android开发——RecyclerView特性以及基本使用方法(二)

    0.  前言 随着Android的发展,虽然ListView依旧重要,但RecyclerView确实越来越多的被大家使用.但显然并不能说RecyclerView就一定优于ListView,而是应该根据 ...

  3. android开发实现选择列表,Android使用RecyclerView实现列表数据选择操作

    Android使用RecyclerView实现列表数据选择操作 发布时间:2020-08-31 17:50:13 来源:脚本之家 阅读:76 作者:迟做总比不做强 这些时间做安卓盒子项目,因为安卓电视 ...

  4. Android实战简易教程-第五十一枪(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)

    前段时间写过一篇文章:Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)有的同学留言建议,可不可以动态控制checkbox的显示和全选反选功能,我研究了一下,发现实现也比较容 ...

  5. RecyclerView的曝光统计

    本文提供了一种Android列表曝光统计的功能实现.使开发者无需关心数据收集过程,只需简单的设置即可在适当的曝光时机通知开发者所需的曝光数据. 产品需求中我们经常会有统计recyclerView的每个 ...

  6. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...

  7. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

  8. Android实战技巧之十一:Android Studio和Gradle

    2019独角兽企业重金招聘Python工程师标准>>> 经过两个多月的AS体验,我认为是时候将Android的开发环境迁移到AS上了.目前最新版本是1.0.2(大年30当天升级到1. ...

  9. [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6641794.html [Android]使用RecyclerV ...

最新文章

  1. 219个opencv常用函数汇总
  2. ie下面出现Notice: Undefined index: HTTP_REFERER 的解决办法
  3. android app系统的测试_计算机毕设项目003之基于Android系统的App点餐外送系统
  4. 页面jlabel背景色设置_(六)使用elementUI搭建管理员页面布局
  5. 可应用于实际的14个NLP突破性研究成果(三)
  6. python 打印皮卡丘_用python打印你的宠物小精灵吧
  7. mfc编程 孙鑫_孙鑫VC++视频教程笔记-(3)MFC程序框架的剖析 附1-SDI程序流程图
  8. 怎样在计算机中创建d盘,我在电脑D盘内新建了一个文件夹,怎么才能给 – 手机爱问...
  9. 在datagrid中的toolbar添加输入框
  10. 使用SqlBulkCopy 批量操作大量数据
  11. Windows 10下adb、fastboot工具的配置
  12. python判断excel某单元格是否为空
  13. 用lambda表达式写左联查询的示例
  14. java的跨平台特性是指_如何理解JAVA的跨平台特性
  15. 区块链系统开发介绍模块
  16. MT4白标升级MT5 用户信息
  17. beanshell相关知识
  18. 用h5简单实现APP帮助中心(FAQ),下次也可以用
  19. 谈谈开发者眼中的编程语言是怎样的?
  20. 使用OpenCV时出现的未加载ntdll.pdb的一种解决方案

热门文章

  1. 干货分享|串流游戏软件大比拼
  2. 手机不显示网络信号连接到服务器是怎么回事,手机连接不上网络怎么办
  3. 计算机为啥启用不了网络发现,win7系统“网络发现”功能启用不了的解决方法...
  4. 全屏播放PPT时,播放音乐
  5. 区块链、NFT 与元宇宙中的稀缺性技术
  6. 深度分析网络游戏运营手段
  7. Python绝技第一章 入门 python3实现密码破解
  8. CodeForces - 855B(思维)
  9. python随机生成10道乘法题_python3 随机生成10以内的加法算术题
  10. python学习笔记(九)异常处理