在RecyclerView中垂直居中选定的项目

Vek*_*r88 9 android android-recyclerview

我正在尝试为我的应用程序实现某种轮选择器,因为当前的选项依赖于自定义Views或旧的ListView,所以我想基于我的解决方案RecyclerView.

我所做的到现在为止是在开始和结束时设定RecyclerView 2 View与不同类型,命名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;
    }
});
Run Code Online (Sandbox Code Playgroud)

现在我试图了解如何使所选项目保持垂直居中.

到目前为止我尝试了什么:

1- LinearSnapHelper

LinearSnapHelper helper = new LinearSnapHelper();
helper.attachToRecyclerView(mRecyclerView);
Run Code Online (Sandbox Code Playgroud)

没有按预期工作,我也尝试覆盖几种方法(可能是以错误的方式),但我无法使其自动垂直居中选择.并且它不够活泼,所选项目"移动"而不是被锁定到垂直中心.

2-自定义 RecyclerView.OnScrollListener

我尝试通过更改 此行来调整此处提出的代码,即用于水平滚动RecyclerView.OnScrollListener

allPixelsDate += dx;
Run Code Online (Sandbox Code Playgroud)

与垂直滚动差异:

allPixelsDate += dy;
Run Code Online (Sandbox Code Playgroud)

此实现接近工作,因为它选择最接近列表垂直中心的项目,但不将其锁定到中心.

是否有可能实现这样的结果?怎么样?

更清楚一点:我想在1:10 得到这里显示的结果.选择被"锁定"在中心.

lob*_*zik 10

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

这是一个有效的例子:

LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setOnFlingListener(snapHelper);
Run Code Online (Sandbox Code Playgroud)

要获得真正的车轮选择器,您还需要为车轮添加一些外观,并准确计算RecyclerView的行高和高度.例如,如果要在车轮中仅显示3行,则需要RecyclerView高度比行高大3倍.