先说需求:项目中有个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传入的角标是屏幕可见范围内的角标,而不是所在位置的角标;
如有不明白,或者写的不清楚的地方可以给我留言或者私信我!