【问题标题】:Vertically center selected item in RecyclerView在 RecyclerView 中垂直居中选中项目
【发布时间】:2017-01-04 05:55:00
【问题描述】:

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

到目前为止,我所做的是在 RecyclerView 的开头和结尾设置两个 View 具有不同的类型,命名为 PADDING_TYPE 以便第一个和最后一个项目在 @ 中垂直居中987654333@。

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

我尝试通过更改 RecyclerView.OnScrollListener 这一行来调整建议的代码 here,用于水平滚动

allPixelsDate += dx;

与垂直滚动的区别:

allPixelsDate += dy;

这个实现接近于工作,因为它选择了最接近列表垂直中心的项目,但没有将其锁定在中心。

有可能达到这样的结果吗?怎么样?

更清楚地说:我希望在 1:10 达到here 显示的结果。选择被“锁定”在中心。

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

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

这是工作示例:

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

要获得真正的轮子选择器,您还需要为轮子添加一些皮肤,并准确计算 RecyclerView 的行高和高度。例如,如果您只想在轮子中显示 3 行,则需要 RecyclerView 高度是行高的 3 倍。

【讨论】:

  • 我尝试了您建议的方法,它的行为似乎与我的尝试编号 1 中的相同。我想要实现的是删除任何滚动效果:行的内容应该通过滚动来更新,但行不应该移动,这样选择就会“卡住”并且垂直居中。使用LinearSnapHelper,它只是定期滚动并尝试 - 糟糕地 - 将中间孩子捕捉到其父级的中心(RecyclerView)。为了更好地理解我的意思,请在 1:10 查看youtube.com/watch?v=rercnPOELvs
  • @Vektor88 您希望用户如何更改所选项目?扔还是不扔?
  • 是的,看看视频。我希望投掷只是导致更新行并且没有滚动运动。
  • 我想你应该重写 LayoutManager 和方法 canScrollVertically() 返回 false。比覆盖你的投掷侦听器(SnapHelper)对投掷作出反应并更改中心的项目。
  • 我不知道最初的那个人想要达到什么目的,但你救了我的一天,这是肯定的。谢谢!
猜你喜欢
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2013-03-21
  • 2017-10-09
相关资源
最近更新 更多