关键词:
一、概要
100行代码实现recyclerview条目曝光埋点设计
二、设计思路
- 条目露出来一半以上视为该条目曝光。
- 在rv滚动过程中或者数据变更回调OnGlobalLayoutListener时,将符合条件1的条目记录在曝光列表、上传埋点集合里。
- 滚动状态变更和OnGlobalLayoutListener回调时,且列表状态为idle状态,触发上报埋点。
三、容错性
- 滑动过快时,视为未曝光
- 数据变更时,重新检测曝光
- 曝光过的条目,不会重复曝光
四、接入影响
- 对业务代码零侵入
- 对列表滑动体验无影响
五、代码实现
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实现多类型布局有各种各样的实现方式,这里就不多说了。本来很开心的实现完了,在测试中确遇到... 查看详情