獲取recycleView瀑布流模式下第一個完全顯示出來的View,解決獲取不准問題,坑點

Main-zy發表於2017-09-28

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

相關文章