Listview 获取由不可见到可见的item的index

项目需要统计listview中每个“曝光”的item的数据,即,随着滑动,某个item由不可见到可见,那我就需要把这个item的index获取到,以便后续操作。当然,如果某个item已经是可见的,那么在滑动的时候如果没有划出屏幕之外,就不再“曝光”,以免造成重复“曝光”,但是当已经“曝光”的item划出屏幕之后再次划入屏幕变成可见,那么需要重新“曝光”,解决办法如下:

实现OnScrollListener接口,重写onScroll方法,listview滑动时会调用onScroll方法,在这个方法里展开逻辑判断,具体代码如下:

先定义一个visibleList存储上一次屏幕上可见的item的index:

    private List<Integer> visibleList = new ArrayList<Integer
在定义一个list存储每次滑动后屏幕上可见的item的index,然后在onscroll里比较两个list,找出两个list里不同的元素即可得到新“曝光”的item的index,这些新的index必定是由不可见变为可见的。代码如下:

@Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        if (performanceWidgetTicket != null && mLiveShowTicketList != null) {//这行代码是我的数据操作所需要的null判断,可换成你需要的条件
            // 比较两次可见的item的序号,只曝光新出现的
            ArrayList<Integer> list = new ArrayList<Integer>(visibleItemCount);
            // 将最新可见item的index加入到临时list中
            for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {
                list.add(i);
            }
            if (visibleList != null && list != null) {
                //新可见item的index的集合
                ArrayList<Integer> diffList = getDiffrent(list, visibleList);

                if (diffList != null) {
                    for (int x = 0; x < diffList.size(); x++) {
                        // 曝光操作
                        // 在这里做相应操作
                        LogUtils.LOGD(TAG, "diffList.get(x):" + diffList.get(x));

                    }
                    //更新list,将最新的可见item的index加入到list
                    visibleList.clear();
                    visibleList.addAll(list);

                }
            }
            //清空最新可见item的index的list
            if (list != null) {
                list.clear();
            }
        }
    }

    /**
     * @MethodName:getDiffrent
     * @tags:@param list1
     * @tags:@param list2
     * @tags:@return 
     * @return_type:ArrayList<Integer>
     * @exception 
     * @TODO:取出两个list中不同的元素加入到新的list
     * @since
    */
    private ArrayList<Integer> getDiffrent(List<Integer> list1, List<Integer> list2) {
        long st = System.nanoTime();
        ArrayList<Integer> diff = new ArrayList<Integer>();
        for (Integer index : list1) {
            if (!list2.contains(index)) {
                diff.add(index);
            }
        }
        return diff;
    }

这样,每次滑动listview,重新映入眼帘的item就会被得到其index了。

------------------------------------------------------------------------------------------------------------------------------

-------------------------------------再次编辑--------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------


后来想到,将逻辑放在onscroll里不是很好,首先滑动过程会一直调用onscroll,这样会造成:当用户快速滑动listview时会不停的“曝光”,但“曝光“的数据没有意义,用户可能根本没有认真的去看快速划过的数据(太快,也无法认真看),并且会引起页面卡顿,此外,如果listview数据总数不变还好,若是具有上拉加载更多功能,那么数据就是在变化的,在onscroll里处理数据可能引起数组越界之类的问题。最后还是将逻辑放在listener的另一个方法里(onScrollStateChanged)比较合适,根据参数里面的滚动状态来判断是否已经停止滚动,若停止,则停止滑动的时候再把可见的item”曝光“。

------------------------------------------------------------------------------------------------------------------------------

-------------------------------------再次编辑--------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------

今天需求确定了,要求listview滑动的时候,每个由invisible变为visible的item都要“曝光”,都要获取其position,暂且不管这种曝光获得的数据是否有意义,只讲实现,如果按照这个需求,那么就不再需要在onscrolllistener里做什么了,在adapter的getview方法里处理就可以了,因为每次新出现的item都要调用getview,即可获取到position。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值