android实战——recyclerview条目曝光埋点(代码片段)

callme大帅 callme大帅     2023-02-20     799

关键词:

一、概要

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 = 0

    var isEnableExposure = true
    private var mCheckChildViewExposure = true

    private val mViewVisible = Rect()
    fun checkChildExposeStatus() 
        if (!isEnableExposure) 
            return
        
        val length = mRecyclerView.childCount
        if (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 = newState
                uploadList()
            

            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())
        // 上报成功后返回true
        return true
    

)

完结,撒花🎉

android实战——recyclerview条目曝光埋点(代码片段)

一、概要100行代码实现recyclerview条目曝光埋点设计二、设计思路条目露出来一半以上视为该条目曝光。在rv滚动过程中或者数据变更回调OnGlobalLayoutListener时,将符合条件1的条目记录在曝光列表、上传埋点集合里。滚动状态变... 查看详情

处理recyclerview的条目点击和多选

这个图片选择界面使用了supportv7里的一个控件RecyclerView并且做了多选功能。<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content" android:layout_height="wrap 查看详情

android浅析recyclerview回收复用机制及实战(仿探探效果)(代码片段)

android浅析RecyclerView回收复用机制及实战,仿探探效果浅析RecyclerView回收复用机制缓存机制-onTouchEvent()入口缓存机制-onLayout()入口复用机制探探效果实战还是老套路,先来看看实现的效果!浅析RecyclerView回收复用机制在写这个效果之前... 查看详情

android实战----recyclerview下拉刷新和上拉加载的简单实现(代码片段)

一、简介关于RecyclerView的介绍网上有很多文章,这里不做过多说明,也不与ListView相比较。本文旨在基于RecyclerView实现下拉刷新和上拉加载,简单的不能再简单了。二、代码托管https://github.com/honghailiang/RecyclerView_Refresh... 查看详情

android实战----recyclerview下拉刷新和上拉加载的简单实现(代码片段)

一、简介关于RecyclerView的介绍网上有很多文章,这里不做过多说明,也不与ListView相比较。本文旨在基于RecyclerView实现下拉刷新和上拉加载,简单的不能再简单了。二、代码托管https://github.com/honghailiang/RecyclerView_Refresh... 查看详情

从 RecyclerView 中删除房间条目

】从RecyclerView中删除房间条目【英文标题】:DeletingRoomentryfromRecyclerView【发布时间】:2018-09-0105:41:25【问题描述】:我是编程新手,我跟随thistutorial使用适配器创建了RecyclerView。我不知道如何使用我的Dao中的删除功能与每个条目... 查看详情

recyclerview条目的点击事件

publicclassMyAdapterextendsRecyclerView.Adapter<RecyclerView.ViewHolder>{privateList<GoodsBean.GoodsListBean>list;privateContextcontext;//2、定义一个属性privateOnItemClickListeneronItemClickListe 查看详情

等recyclerview加载完毕就点击第一个条目

recyclerView.addOnLayoutChangeListener(object:View.OnLayoutChangeListeneroverridefunonLayoutChange(v:View?,left:Int,top:Int,right:Int,bottom:Int,oldLeft:Int,oldTop:Int,oldRight:Int,oldBottom:Int)//当RecyclerView加载完毕时,移除监听器并自动点击第一个itemrecyclerView.removeOnL... 查看详情

实现每日优鲜中recyclerview多条目背景效果(代码片段)

...f0c;如下图所示。通过查看它的布局发现,整体是使用RecyclerView来实现的,头部的“平价好菜”是一个条目,下面的每种菜也是一个条目。那么“洋葱”和“油菜”后面的背景是怎么设置上去的呢?思路通过以上可... 查看详情

android短视频滑动播放(一)

参考技术A本文主要介绍采用RecyclerView配合PagerSnapHelper实现短视频滑动播放内容。主页布局文件定义RecyclerView,为RecyclerView建立对应适配器。适配器条目中添加视频播放容器FrameLayout及封面ImageVIew.PagerSnapHelper结合LinearLayoutManager实现... 查看详情

实现每日优鲜中recyclerview多条目背景效果(代码片段)

...f0c;如下图所示。通过查看它的布局发现,整体是使用RecyclerView来实现的,头部的“平价好菜”是一个条目,下面的每种菜也是一个条目。那么“洋葱”和“油菜”后面的背景是怎么设置上去的呢?思路通 查看详情

如何清空recyclerview数据

参考技术A这个是因为你的这个recyclerView的适配器adapter的数据还没有被清空,虽然你removeAllView()了,但是你的data没有清空,之后又notifyDataSetChanged(),recyclerView又被重新加载了,所以又出现view了。至于保留着新的条目,这... 查看详情

android瀑布流条目错乱解决方法

...在滑动到顶部是可能会出现顶部留白的问题,所以要重写recyclerview的onscrollstatechangelistener方法,在加载第一行的条目时调用layoutmanager.invalidateSpanAssignments(); 查看详情

实战|认识recyclerview(代码片段)

RecyclerView是一款非常强大的widget,它可以帮助您灵活地显示列表数据。当我开始学习RecyclerView的时候,我发现对于复杂的列表界面有很多资源可以参考,但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView... 查看详情

一种优雅的方式实现recyclerview条目多类型

转载请标明出处:http://blog.csdn.net/xuehuayous/article/details/80021325;本文出自:【Kevin.zhou的博客】下面以一个故事来讲来说明这中方式是怎么实现的。放弃vlayout大家都了解一般首页是非常复杂的,去年初项目引入vlayout来解决首... 查看详情

android列表拖动listview~recyclerview(代码片段)

最近有需求要做列表的拖动以及删除和增加业务,经过一番考量给出了效果。 长按频道管理中的条目可以上下滑动,增加或者删除对应的频道。android列表拖动有一个强大的类就可以轻松实现了,就是ItemTouchHelper࿰... 查看详情

recyclerview中多任务下载文件进度条更新的问题

在recyclerview或listview中进行下载时,由于条目复用等原因会导致下载的进度条更新错乱。你可能觉得条目复用问题我解决过那么多次,加个tag了啥的就解决了不是。有这个想法说明你没做过下载的处理。因为在下载的过程中,进... 查看详情

recyclerview.viewcacheextension使用及踩坑(代码片段)

...需求实现上并不复杂,大概长这个样:基本上就是一个RecyclerView嵌套多个子RecyclerView,有横向的,也有竖向的。RecyclerView实现多类型布局有各种各样的实现方式,这里就不多说了。本来很开心的实现完了,在测试中确遇到... 查看详情