安卓统计ListView在屏幕上的时间

项目上有一个需求,要求统计用户预览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 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();
    }
}

demo请看github: https://github.com/zsaCHG/zhangsongaoDEMO/blob/master/ZhangsongaodemoProject/app/src/main/java/com/demo/zhangsongaodemo/androidtest/CatchTimeInListView.java

你可能感兴趣的:(安卓统计ListView在屏幕上的时间)