如何获取ListView可见Item数

 我来答
边关急报
推荐于2018-04-11
知道答主
回答量:34
采纳率:28%
帮助的人:6.6万
展开全部
项目需要统计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;
}
time陌言成殇
2015-01-31 · TA获得超过8.4万个赞
知道大有可为答主
回答量:1.4万
采纳率:91%
帮助的人:9474万
展开全部

您好,很高兴为您解答。


lvSingleContinueView是一个ListView。其实这个也不是正确的全部可见,只是当前ListView视图加载ListViewItem的索引数。
可能是ListView自动开启了虚拟加载之类,ListView是不会全部加载Item,只会加载需要的部分。

  private List<int> GetItemIndexInSight()
        {
            List<int> itemIndexInSight = new List<int>();

            var genertor = this.lvSingleContinueView.ItemContainerGenerator;
            for (int i = 0; i < this.lvSingleContinueView.Items.Count; i++)
            {
                var listviewItem = genertor.ContainerFromIndex(i) as ListViewItem;
                //如果不可见是为null的
                if (listviewItem != null)
                {
                    itemIndexInSight.Add(i);
                }
            }

            return itemIndexInSight;
        }


如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】


希望我的回答对您有所帮助,望采纳!


                                                                                                                             ~ O(∩_∩)O~

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式