安卓统计ListView在屏幕上的时间
2018-11-14 本文已影响15人
ZSACH
项目上有一个需求,要求统计用户预览Listview各个item的时间,如果大于1秒,则提交日志,这个需求很迷。
最初的想法就是使用getView这个加载的回调,但是listview并没有给回收这个view的回调,这就很蛋疼。看listview的文档,有一个滑动的监听onScroll,并且这个方法提供了滑动过程中listview 可见item的参数。
第二个参数是第一个可见的item的index,第三个参数是可见item的总数,第四个参数是listview一共的item数。
利用这几个参数,解决的思路就是,利用主线程的消息队列,每一秒轮询一次。如果用户滑动了屏幕,那么需要取消轮询,开始新一轮轮询,当1秒的时间用户没有任何操作(停留在屏幕上)那么我们提交这个区间的日志。
主要代码
/**
* 获取listview上 item显示的时间 如果大于1秒 则记录日志
*/
public static void catchItemShowTime(int firstVisibleItem, int visibleItemCount, int totalItemCount,
final List<RecommendArticle> recommendList) {
try {
if (recommendList != null && recommendList.size() > 0) {
if (orderFirstIndex != firstVisibleItem || orderLastIndex != visibleItemCount + firstVisibleItem - 1) {
//如果当前可见item区间和上一次的记录不一致,那么说明用户滑动了
if (run != null) {
//取消上一次的轮询
getMainHandler().removeCallbacks(run);
}
//记录新的区间起始点数据
orderFirstIndex = firstVisibleItem;
orderLastIndex = visibleItemCount + firstVisibleItem - 1;
run = new Runnable() {
@Override
public void run() {
//提交日志
reportItem(recommendList);
}
};
Tools.postDelayed(run, 1000);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}