getChildAt 踩坑

博客讲述了在RecyclerView中使用getChildAt(index)方法时遇到的问题。作者强调getChildAt()的index参数应为屏幕可视范围内的角标,而非Item的实际位置角标。在实现广告曝光监测时,需要正确计算屏幕内Item的位置以调用曝光方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说需求:项目中有个recycleview,recycleview中插入了一个广告,当这个广告在屏幕可视范围之内的话就需要调曝光的方法,曝光的方法有个参数是当前的广告view;

直接上代码
recycleRecommended.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                switch (newState) {
                    case RecyclerView.SCROLL_STATE_IDLE:
                        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
                        //判断是当前layoutManager是否为LinearLayoutManager
                        if (layoutManager instanceof LinearLayoutManager) {
                            LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
                            //获取最后一个可见view的位置
                            int firstItemPositin = linearManager.findFirstVisibleItemPosition();
                            int lastItemPosition = linearManager.findLastVisibleItemPosition();
                            for (int i = 0; i <= lastItemPosition-firstItemPositin; i++) {
                                if (recommended_data != null && recommended_data.size() > (i+firstItemPositin) && recommended_data.get(i+firstItemPositin).infoMationInfo != null) {
                                    ((DoNewsAdNativeData) recommended_data.get(i+firstItemPositin).infoMationInfo).onExposured(recyclerView.getChildAt(i+1));
                                }
                            }
                        }
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
        });

以上代码:监听recycleview的滑动方法,获取到recycleview显示的第一个和最后一个item角标,然后判断广告是否在这个显示的区间内,如果在的话获取到广告对象调onExposured曝光方法;其中用到了getChildAt来获取view,getChildAt需要传入一个角标,这个角标实际上传入的是屏幕可见范围内的角标,而不是广告所在位置的角标
在这里插入图片描述
以上面的图为例(有点丑不过这不重要),比如广告是在整个recycleview的第7位,即角标为6的地方,当滑动到这种状态下,想要获取广告的itemView,getChildAt(index)中的index不应该传6,而是应该传入可视范围的角标,即应该传入4;

for (int i = 0; i <= lastItemPosition-firstItemPositin; i++) {
        if (recommended_data != null && recommended_data.size() > (i+firstItemPositin) && recommended_data.get(i+firstItemPositin).infoMationInfo != null) {
             ((DoNewsAdNativeData) recommended_data.get(i+firstItemPositin).infoMationInfo).onExposured(recyclerView.getChildAt(i+1));
        }
 }

可以通过以上方法通过for循环获取到当前显示的角标i,然后通过getChildAt(i+1)获取到当前view;

总结:getChildAt(index)中的index传入的角标是屏幕可见范围内的角标,而不是所在位置的角标;

如有不明白,或者写的不清楚的地方可以给我留言或者私信我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值