2017-06-20 93 views
3

我想用RecyclerView來模擬MultiViewPager的行爲,特別是我希望在屏幕中心的選定項目包括第一個和最後一個元素RecyclerView的水平居中第一項

正如你可以在這張圖片中看到的,第一個項目居中,這將是我的預期結果。 Expected result

我所做的就是建立一個RecyclerView與水平LinearLayoutManagerLinearSnapHelper。這個解決方案的問題是,第一個和最後一個項目將永遠不會水平居中作爲選擇。我是否應該切換我的代碼,以便它使用MultiViewPager或者是否可以利用RecyclerView獲得類似的結果?

回答

6

您可以在getItemOffsets()中用RecyclerView.ItemDecoration執行此操作,以適當地補償第一個和最後一個項目。

檢索給定項目的任何偏移量。 outRect的每個字段指定項目視圖應插入的像素數量,類似於填充或邊距。默認實現將outRect的邊界設置爲0並返回。

如果您需要訪問適配器以獲取其他數據,則可以撥打getChildAdapterPosition(View)以獲取View的適配器位置。

您可能還需要使用物品的粗糙尺寸以及RecyclerView。但是這些信息無論如何都可以使用。

+1

在我看來這是正確的方式,@CzarMatt的其他答案的建議可能會起作用,但對我來說似乎有點哈克。 – Vektor88

+0

@ Vektor88,'裝飾'的使用並不像它看起來那麼好。我是這麼做的,但是它打破了很多'RecyclerView'規則,因爲'裝飾'是爲了作爲項目的擴展。這意味着居中的左/右偏移將被視爲真實視圖'padding/margin',因此它的'LayoutManager.getDecoratedMeasuredWidth()'將會非常大。它會中斷,例如'LinearSnapHelper'。第一個/最後一個元素將被收縮到next/prev上,即使是輕微的觸摸,因爲他們認爲你的視圖是胡德。 – Nexen

+3

@ Vektor88,這是更可取的方式去 - https:// stackoverflow。com/q/29117916/2653714 – Nexen

1

該解決方案的問題是第一個和最後一個項目 將永遠不會水平居中爲選擇。

這可能是因爲您的RecycleView負責在其佈局範圍內顯示您的數據集內的項目數量。

在您提供的示例圖片中,您可以通過在數據集的第一個和最後一個位置添加一個「佔位符」項目來實現該效果。這樣,您可以讓一個隱形物品佔據第一個插槽,從而抵消您想要居中的物品。

此佔位符項目不應對觸摸事件作出響應,也不應干擾處理其他項目上的點擊事件(特別是位置處理)。

您將不得不修改適配器getItemCount或許還有getItemType