当前位置: 首页 > 知识库问答 >
问题:

启动我的回收站从中心项目查看水平旋转木马

林劲
2023-03-14

我正在创建一个carousel Horizontal RecyclerView,它从recycle view的第一个项目开始放大聚焦的项目。

自定义CenterZoomLayoutManager的代码:

public class CenterZoomLayoutManager extends LinearLayoutManager {
private final float mShrinkAmount = 0.15f;
private final float mShrinkDistance = 0.9f;

public CenterZoomLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);
}

@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
    int orientation = getOrientation();
    if (orientation == HORIZONTAL) {

        int scrolled = super.scrollHorizontallyBy(dx, recycler, state);
        float midpoint = getWidth() / 2.f;
        float d0 = 0.f;
        float d1 = mShrinkDistance * midpoint;
        float s0 = 1.f;
        float s1 = 1.f - mShrinkAmount;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            float childMidpoint =
                    (getDecoratedRight(child) + getDecoratedLeft(child)) / 2.f;
            float d = Math.min(d1, Math.abs(midpoint - childMidpoint));
            float scale = s0 + (s1 - s0) * (d - d0) / (d1 - d0);
            child.setScaleX(scale);
            child.setScaleY(scale);
        }
        return scrolled;
    } else return 0;
}

@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
    super.onLayoutChildren(recycler, state);
    scrollHorizontallyBy(0, recycler, state);
}
}

在我的片段中,我有以下内容:

private void onSetRecyclerView() {

    recyclerView = fragmentView.findViewById(R.id.recyclerView);

    if (recyclerView != null) {
        RecyclerView.LayoutManager layoutManager = new CenterZoomLayoutManager(context, LinearLayoutManager.HORIZONTAL,
                false);

        recyclerView.scrollToPosition(storeList.size() / 2);

        final SnapHelper snapHelper = new LinearSnapHelper();
        snapHelper.attachToRecyclerView(recyclerView);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
    }
}

我希望从中心项目开始RecyclerView,而不是从起始位置开始。

罪犯:
在我的CentZoomLayoutManager中,我通过scrollHorizontalyBy(0,回收器,状态)将像素偏移开始设置为0像素。

问题:
我找不到将 recyclerView.scrollToPosition(storeList.size() / 2) 创建的偏移像素传递给 CenterZoomLayoutManager 的方法。我试图搜索不同的内置方法来获得X偏移量,但到目前为止还没有运气。

共有1个答案

呼延俊良
2023-03-14

解决方案是更改< code > linearsnapper 附加到< code > recycle view 的时间。以下是经过修改的< code>onSetRecyclerView(),它将< code>RecyclerView的中心项目对齐到屏幕的中心。请注意,在< code > recycle view 布局并适当滚动之前,不会附加< code > linearsnapper 。您不需要在< code>onLayoutChildren()中进行任何滚动。

private void onSetRecyclerView() {
    recyclerView = findViewById(R.id.recyclerView);
    CenterZoomLayoutManager layoutManager =
        new CenterZoomLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(adapter);
    // Scroll to the position we want to snap to
    layoutManager.scrollToPosition(storeList.size() / 2);
    // Wait until the RecyclerView is laid out.
    recyclerView.post(new Runnable() {
        @Override
        public void run() {
            // Shift the view to snap  near the center of the screen.
            // This does not have to be precise.
            int dx = (recyclerView.getWidth() - recyclerView.getChildAt(0).getWidth()) / 2;
            recyclerView.scrollBy(-dx, 0);
            // Assign the LinearSnapHelper that will initially snap the near-center view.
            LinearSnapHelper snapHelper = new LinearSnapHelper();
            snapHelper.attachToRecyclerView(recyclerView);
        }
    });
}

这是我的测试应用程序的初始屏幕显示方式。有201个“商店”。

 类似资料:
  • 我正在从事一个自由职业者的android项目。我有一个问题,就是根据项目设计需要改变RecyclerView项目之间的利润率。我想显示屏幕上最后一个可见项目的一半,这样用户就可以猜测水平滚动。我尝试创建一个自定义的RecyclerView.itemEdition。当屏幕第一次打开时,一切正常,但当我开始在这个回收视图上水平滚动时,项目之间的间隔增加了,有时甚至减少了。我如何用一般方法解决这个问题。

  • 在这里我有项目的列表在回收器视图这是取自Firebase.所以我试图改变其背景颜色当用户点击它.但是当我点击项目1然后项目4背景颜色也得到改变.如果点击项目2然后项目8颜色也.它给不恰当的结果。 视图持有者类

  • 我想制作一个类似视图的电子表格来显示一些数据。到目前为止,这是我所拥有的,但我一次只能滚动一种方式。我希望能够同时水平和垂直滚动。 现在我有一个水平滚动视图内的回收器视图。 这是我的回收器查看行布局。 这是我在Java中设置我的recyclerView的地方。 任何帮助都将不胜感激。谢谢!

  • 我正在尝试使用一个猫头鹰旋转木马在我的项目,但不知何故没有显示,我不知道是什么问题与它。谁能帮助我理解我做错了什么?我已经按照本教程https://github.com/owlcarousel2/owlcarousel2中的步骤进行了操作,并且我还尝试检查该元素,但没有出现错误,也没有carousel可见。下面是我的html代码: null null 这里是js代码: null null

  • 当我在回收器视图中选择一个项目时,会自动选择多个项目 我正在做的是 我只想获取没有重复的联系人,并在recyclerview中列出所有联系人,并使两个文本视图可见(一个用于数字,第二个用于名称)。完成了,但问题是 当我点击一个项目时,它会被点击4次(例如,如果我点击一个项目,它会显示两个文本视图,但具有相同名称和编号的相同项目会显示出来,就像我点击了4个项目并看到图片一样) 适配器类 在那里我得到

  • 我试图实现带有水平滚动的,所以我使用了带有水平方向的。问题是,我使用2种不同类型的项目填充RecyclerView,具有不同的高度。这是我对项目使用的布局: 这是包含的布局,基本上是这样的: 我使用的是一个,我只是更改了两个子视图的可见性。 我希望得到的结果是: 但我得到的是这个;使用第二种物品的高度将CardView切成两半: 我看到了这个帖子,和我的问题差不多,它推荐使用,于是,我尝试实现: