1. 程式人生 > >Recyclerview豎直瀑布流之間距均等問題,頭部無左右間距

Recyclerview豎直瀑布流之間距均等問題,頭部無左右間距

瀑布流的position是根據列的高度哪個小而來載入下一個position在哪裡, 
上面瀑布流圖我們可以看到,左0,右1 之後,2到右邊了,那是因為 
第二列的高度小於第一列的高度,所以就載入到第二列,以此類推, 
下面的高度可以說就是隨機展示的,誰也不知道接下來要怎麼判斷分割線, 
我們可以通過StaggeredGridLayoutManager.LayoutParams 
裡的getSpanIndex()來判斷,這個方法不管你高度怎樣, 
他都是左右左右開始排列的,樓主是兩列的就設定瞭如下程式碼。
 StaggeredGridLayoutManager.LayoutParams params =
    (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
        /**
         * 根據params.getSpanIndex()來判斷左右邊確定分割線
         * 第一列設定左邊距為space,右邊距為space/2  (第二列相反)
         */
        if (params.getSpanIndex() % 2 == 0) {
            outRect.left = space;
            outRect.right = space / 2;
        } else {
            outRect.left = space / 2;
            outRect.right = space;
        }
我的頭部是寬度是螢幕寬度 就偷懶通過 parent.getChildAdapterPosition(view) == 0 單獨拿出來設定了
設定後發現問題,剛開始展示的時候是沒有問題的,但是滑動之後 滑回來的時候因為瀑布流要保證每次都填充滿螢幕,這樣的機制
導致了item會發生一定的變化,試著鎖定item的位置。通過recycleView.addOnScrollListener的 onScrollStateChanged()方法中呼叫了staggeredGridLayoutManagerlayoutManager.invalidateSpanAssignments()。
然而還是無法顯示item移動問題。 然後又採用記錄設定item大小的方法
定義一個HashMap<Integer, Float> indexMap = new HashMap<Integer, Float>();用來儲存已顯示過的ImageView尺寸,顯示時直接取其比例即可


程式碼:onBindItemView(),呼叫resizeItemView(itemViewHolder.frontCoverImage, getScaleType(position));
然而還是沒有效果
繼續調整l StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);  
        //RecyclerView滑動過程中不斷請求layout的Request,不斷調整item見的間隙,並且是在item尺寸顯示前預處理,因此解決RecyclerView滑動到頂部時仍會出現移動問題  
        layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);  
        mRecyclerView.setLayoutManager(layoutManager);  
        mRecyclerView.addItemDecoration(new DividerGridItemDecoration(getContext()));  
        mRecyclerView.setPadding(0, 0, 0, 0);  
        mRecyclerView.addOnScrollListener(new OnScrollListener() {  
            @Override  
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
                super.onScrollStateChanged(recyclerView, newState);  
                layoutManager.invalidateSpanAssignments();  
            }  
        });  
然而還是無法解決,這時候轉換思路, 演化了整個複用過程中的item變化,發現item是在設定間距之後進行item移動的,
這才是問題的致命所在,item設定間距之後,因為有上下間距的存在,會對瀑布流的排列造成一點的影響,所以會在間距設定之後
才進行整個介面的填充,然後如何處理這個問題呢。
經過本人實驗,可行,可以刨除item移動帶來的影響。
第一次的間距是對的說明 * 根據params.getSpanIndex()來判斷左右邊確定分割線 是可行的。然後通過監聽recycleview的滑動去實時改變間距,
也就是重新整理 recyclerView.invalidateItemDecorations();
至此這個問題終於解決了。