1.背景
最近遇到一个需求:一个ListView中有30多个item,每个item划入屏幕算一次item的浏览事件,并且如果在很快的时间内(例如1秒)又划出了屏幕,就不算浏览事件。
之前一直都是RecyclerView,对于RecyclerView可以通过重写onViewAttachedToWindow(VH holder)和onViewDetachedFromWindow(VH holder)这两个方法完成这个功能。ListView是否也有类似的机制呢(也行你会问为啥不用RecyclerView,因为老的代码用的是ListView,逻辑很复杂,重构成RecyclerView太耗时耗力了)
找了一上午,终于找到了解决办法,关键的代码就是需要实现AbsListView.RecyclerListener接口并在onMovedToScrapHeap(View view)方法里面实现相应的功能(实现了类似RecyclerView的onViewDetachedFromWindow(VH holder)方法的功能):即在item离开屏幕的时候系统会回调这个方法
2.AbsListView.RecyclerListener
3.实现思路
3.1 item划入屏幕埋点
item划入屏幕的时候会调用Adapter的getView方法。在这个方法里面发送一个延迟消息(1秒后进行item浏览事件的埋点)
3.2 item划出屏幕取消埋点
item划出屏幕的时候,系统会调用onMovedToScrapHeap方法。在这个方法里面取消延迟消息的发送(这样就达到了快速滑动的时候不计入浏览埋点,而正常情况下会计入浏览埋点的功能)
3.github
https://github.com/fightingBirdCaiy/Util 入口类为ListViewCtrActivity