2016-08-27 53 views
9

我想爲我的應用程序實現某種輪選取器,因爲當前的選項依賴於自定義Views或舊的ListView,所以我想基於RecyclerView我的解決方案。在RecyclerView垂直中心選定的項目

我做什麼之前,這是設置在開始和與不同類型的結束,一個名爲PADDING_TYPE使得第一和最後一個項目的RecyclerView垂直居中。

recyclerView.post(new Runnable() { 
    @Override 
    public void run() { 
     //80dp is the height of a regular list item 
     int paddingHeight = ((recyclerView.getHeight()-SettingsManager.dptopixels(80))/2); 
     binding.getRoot().getLayoutParams().height = paddingHeight; 
    } 
}); 

現在我想了解如何保持選定的項目垂直居中。

我試過到目前爲止:

1 LinearSnapHelper

LinearSnapHelper helper = new LinearSnapHelper(); 
helper.attachToRecyclerView(mRecyclerView); 

不按預期工作,我也試着重寫幾種方法(可能以錯誤的方式),但我可以不會自動垂直居中選擇。而且它不夠快速,所選項目「移動」而不是鎖定到垂直中心。

2-定製RecyclerView.OnScrollListener

我試圖適應代碼提出here,這對於橫向滾動,通過在此RecyclerView.OnScrollListener

allPixelsDate += dx; 

改變與垂直滾動差:

allPixelsDate += dy; 

本實施方案n接近工作,因爲它選擇了最接近列表的垂直中心的項目,但沒有將其鎖定到中心。

有可能實現這樣的結果嗎?怎麼樣?

更加清楚:我想在1:10時達到顯示的結果here。選擇在中心「鎖定」。

+0

請嘗試此代碼以供參考[鏈接](http://developer.samsung.com/s-pen-sdk/samples/Circle-Launcher) – Moinkhan

+0

我已經使用https://github.com/ai212983/ android-spinnerwheel和我認爲你需要垂直Mannner https://github.com/Jaouan/Carousel-Browsing-Example – Nepster

+0

你可以使用這個方法垂直到這個實現[open this](http://stackoverflow.com/a/38411582/2587027) – wadali

回答

10

您只需在您的RecyclerView上使用LinearSnapHelper和setOnFlingListener(snapHelper)方法。

這是工作例如:

LinearSnapHelper snapHelper = new LinearSnapHelper(); 
snapHelper.attachToRecyclerView(recyclerView); 
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
recyclerView.setOnFlingListener(snapHelper); 

要得到真正的輪選擇器,你還需要添加一些皮膚的輪和精確計算行和RecyclerView的高度的高度。例如,如果要在輪子中僅顯示3行,則需要RecyclerView高度比行高度大3倍。

+1

我嘗試了你建議的方法,它的行爲似乎與我的嘗試號** 1 **相同​​。我試圖實現的是去除任何滾動效果:行的內容應該通過滾動來更新,但行不應該移動,以這種方式選擇被「卡住」並且垂直居中。使用'LinearSnapHelper',它只是定期滾動並嘗試 - 很差 - 將中間的孩子對準其父母的中心(「RecyclerView」)。爲了更好地理解我的意思,請查看https://www.youtube.com/watch?v=rercnPOELvs 1:10 – Vektor88

+0

@ Vektor88您希望用戶如何更改所選項目?通過扔或不扔? – lobzik

+0

是的,看看視頻。我希望這個投擲只會導致行更新和不滾動。 – Vektor88