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

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;
        }
    }

你可能感兴趣的:(android)