第一个项目中心在 RecyclerView 的 SnapHelper 中对齐

2024-01-11

我在 RecyclerView 中使用 PagerSnapHelper。 RecyclerView 中的第一个项目位于屏幕的左侧位置。 我需要居中对齐的第一个项目。

LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
PagerSnapHelper snapHelper = new PagerSnapHelper();
binding.recyclerView.setOnFlingListener(null);
snapHelper.attachToRecyclerView(binding.recyclerView);
binding.recyclerView.setLayoutManager(layoutManager);
binding.recyclerView.setHasFixedSize(true);
binding.recyclerView.setItemAnimator(new DefaultItemAnimator());
binding.recyclerView.setAdapter(mAdapter);

您可以使用 ItemDecoration,下面的代码适用于第一个和最后一个项目,并且还支持边距。

import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;

public class OffsetItemDecoration extends RecyclerView.ItemDecoration {

    private Context ctx;

    public OffsetItemDecoration(Context ctx) {

        this.ctx = ctx;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

        super.getItemOffsets(outRect, view, parent, state);
        int offset = (int) (getScreenWidth() / (float) (2)) - view.getLayoutParams().width / 2;
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
        if (parent.getChildAdapterPosition(view) == 0) {
            ((ViewGroup.MarginLayoutParams) view.getLayoutParams()).leftMargin = 0;
            setupOutRect(outRect, offset, true);
        } else if (parent.getChildAdapterPosition(view) == state.getItemCount() - 1) {
            ((ViewGroup.MarginLayoutParams) view.getLayoutParams()).rightMargin = 0;
            setupOutRect(outRect, offset, false);
        }
    }

    private void setupOutRect(Rect rect, int offset, boolean start) {

        if (start) {
            rect.left = offset;
        } else {
            rect.right = offset;
        }
    }

    private int getScreenWidth() {

        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        return size.x;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一个项目中心在 RecyclerView 的 SnapHelper 中对齐 的相关文章

随机推荐

  • YouTube Iframe API onError 事件近几个月没有触发

    我非常确定 YouTube Iframe API onError 事件过去会触发 因为我运行一个基于此 API 的项目 但最近 onError 事件不会触发 即使是最简单的错误 这是一个基于官方页面的简单示例代码 https develop
  • Android USB 枚举

    我正在编写一个 Android USB 主机应用程序 我试图枚举与平板电脑连接的设备 我遵循开发者网站的 android USB 主机文档中的代码 我的代码如下 AndroidUSB活动 public class AndroidUSBAct
  • 不允许同一用户使用多个用户名多次连接到服务器或共享资源

    使用Windows 2008 R2 在我们的服务器上 我们收到此错误 不允许同一用户使用多个用户名与服务器或共享资源建立多个连接 断开与服务器或共享资源的所有先前连接 然后重试 尝试在命令行上映射驱动器时 但是 远程计算机没有打开资源管理器
  • 自动完成参数:列出静态字段,无需输入 ClassName::

    How to make auto completion list all static fields of a certain class that has appropriate variable type when ctrl space
  • 如何在 django 中的模板标签内获取模板的渲染输出?

    免责声明 这是一个后续问题我之前的问题 https stackoverflow com questions 5332640 how can i get a django template to render itself within a
  • 需要帮助理解证书链

    目前我正在编写一个java库来访问pointhq com的REST API 在开发 Android 客户端时 我意识到默认情况下不接受 SSL 证书 因此我编写了一个自定义 TrustManager 并添加了 pointhq com 证书
  • Spring、Jackson 和定制(例如定制反序列化器)

    由于对Spring还有些陌生 我遇到了一个problem https stackoverflow com questions 3535569 jackson json throws jsonmappingexception when flo
  • 动态启用/禁用 Azure WebJob 中的触发功能

    我们有一个 Azure Web 作业 它在 Functions cs 文件中具有两个方法 这两个作业都是由 Azure 服务总线中的不同主题触发的 由于这在运行时使用反射来确定要由命中主题的消息运行 触发的函数 因此代码中没有对这些方法的引
  • Xamarin 表单获取通话时长

    我有一个 xamarin forms 应用程序 当单击标签时它将打开拨号器 我想要实现的是 用户点击标签 gt 拨号器 ios 中的电话应用程序 打开 用户调用并结束 gt 返回应用程序 单击标签时我可以打开拨号器 我可以在我的应用程序中获
  • php://input 在 PHP 5.6.16 中只能读取一次

    PHP手册 http php net manual en wrappers php php声明使用 php input 打开的流支持查找操作 并且从 PHP 5 6 开始可以多次读取 但我无法使其工作 下面的例子清楚地表明它不起作用
  • 当没有输入时,currencyconverter可以忽略$符号吗

    在数据表中 我必须将输入验证为货币 当我删除 符号后输入值时 输入组件会抛出错误
  • Kendo UI jQuery 网格服务器端过滤

    我正在使用 Kendo UI for jQuery Grid 来显示一些数据 到目前为止 我正在使用客户端过滤和分页 其中所有数据记录都在对服务器的初始调用中返回 Web API 和 Dapper 在服务器端使用 然而 由于数据源随着时间的
  • 检查 lambda 表达式中的属性是否为 null

    我有一个试图绑定到列表视图的对象列表 我按两个属性排序 存在的问题是某些记录可能不具有其中一种属性 这会导致错误 我希望它仍然绑定具有该属性的记录 IEnumerable
  • Android图像变换矩阵,将触摸坐标平移回来

    我正在为 Android 构建一个 导航类型 应用程序 对于导航部分 我正在构建一个活动 用户可以使用触摸事件移动和缩放地图 这是位图 并且地图还可以使用指南针围绕屏幕中心旋转 我使用 Matrix 来缩放 转置和旋转图像 然后将其绘制到画
  • 3 层 ASP.NET MVC 应用程序中的依赖注入

    我有一个 3 层应用程序 各层是 Web 表示层 ASP NET MVC gt 只能看到 BLL BLL 业务逻辑层 gt 只看到DAL DAL 数据访问层 So the Web图层对我的一无所知DAL层 我的存储库接口和具体类DAL 它们
  • 如何使 MFC 复选框只读但保持文本启用?

    似乎通过 禁用 属性禁用复选框也会使标题变灰 有谁知道如何保持标题启用但禁用输入 EDIT 根据保罗的想法 我做了以下工作 现在我发现静态标签和复选框具有透明属性 添加了几个复选框 将复选框标题设置为空 将复选框透明属性设置为 true 在
  • 所有的最终课程都是不可变的吗?

    Java中的final类都是不可变的吗 String 和 Integer 都是最终类 我相信它们都是不可变的 不 final 意味着该类不能扩展 它没有提到可变性 例如 final class MutInt public int modif
  • 如何在 Interface Builder (Xcode) 中添加自定义控件

    所以我创建了一个继承自 UIView 的自定义控件 我想在 Interface Builder 中使用它 我知道我可以添加 UIView 并将其类名称设置为我的自定义控件类名称 但它仅出现在运行时 在界面生成器中它只是一个常规的 UIVie
  • ant jar 的主类

    如何在 ant 中设置 jar 的 Main Class 属性 创建清单
  • 第一个项目中心在 RecyclerView 的 SnapHelper 中对齐

    我在 RecyclerView 中使用 PagerSnapHelper RecyclerView 中的第一个项目位于屏幕的左侧位置 我需要居中对齐的第一个项目 LinearLayoutManager layoutManager new Li