Recyclerview豎直瀑布流之間距均等問題,頭部無左右間距
阿新 • • 發佈:2019-01-10
瀑布流的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();
至此這個問題終於解決了。
上面瀑布流圖我們可以看到,左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();
至此這個問題終於解決了。