您的位置:首页 > 其它

获取recycleView瀑布流模式下第一个完全显示出来的View,解决获取不准问题,坑点

2017-09-28 09:59 381 查看
recycleView线性布局或其他布局可以直接用google提供的方法获取,瀑布流就比较坑了,使用google提供的布局获取不准

当时做这个主要用于瀑布流recycleView的视频自动播放,视频播放采用google的EXOPlayer

解决办法:

/**
* 获取瀑布流的第一个完全显示的View
* @param recyclerView
* @return
*/
private View getItemView(RecyclerView recyclerView){
try {
//计算瀑布流的第一个完全显示的item,踩坑
int[] firstVisibleItems = null;
firstVisibleItems=  ((StaggeredGridLayoutManager)recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPositions(firstVisibleItems);
Log.d(LogUtil.BABY_SHOW,"firstVisibleItems="+firstVisibleItems[0]+","+firstVisibleItems[1]+"");
int [] firstCompleteItems=null;
firstCompleteItems=((StaggeredGridLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPositions(firstCompleteItems);
Log.d(LogUtil.BABY_SHOW,"f="+firstCompleteItems[0]+","+firstCompleteItems[1]+"");
int item;
//以下排序是为了防止recycleView有head,造成无法区分那个时完全显示的第一个View问题,坑坑坑,对于瀑布流,Google未提供直接调用的方法,需要自己计算
//排序
if (firstCompleteItems[0]>firstCompleteItems[1]){
int i=firstCompleteItems[0];
firstCompleteItems[0]=firstCompleteItems[1];
firstCompleteItems[1]=i;
}

//排序
if (firstVisibleItems[0]>firstVisibleItems[1]){
int i=firstVisibleItems[0];
firstVisibleItems[0]=firstVisibleItems[1];
firstVisibleItems[1]=i;
}

if(firstVisibleItems[0]>0){
item=firstVisibleItems[0]-firstCompleteItems[0];
}else if(firstVisibleItems[1]>0){
item=firstVisibleItems[1]-firstCompleteItems[1];
}else if(firstVisibleItems[0]==0 && firstVisibleItems[1]==0 && firstCompleteItems[0]==0 && firstCompleteItems[1]==0){
item=1;
}else{
return null;
}
LogUtil.d(LogUtil.BABY_SHOW,"第一个完全显示的item="+item);

View v= recyclerView.getChildAt(item);
return v;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐