You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android水平RecyclerView实现全尺寸屏幕固定显示3个Item方案

解决方案

该需求完全可以实现,你当前出现显示数量不一致的核心原因是将Item根布局宽度写死为100dp,不同尺寸设备的屏幕可用宽度存在差异,固定宽度自然无法保证所有设备下刚好完整显示3个Item。

具体修改步骤

  • 第一步:修改Item布局文件
    打开你的recomemdedservices_item.xml,将根布局RelativeLayout的android:layout_width="100dp"属性改为android:layout_width="wrap_content",其余属性(包括6dp的外边距)保持不变即可。
  • 第二步:修改Adapter的onCreateViewHolder方法,动态计算每个Item的精准宽度
    你之前注释掉的动态设置宽度的逻辑思路是对的,但没有扣除Item外边距占用的空间,所以计算不准,替换为如下代码即可:
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recomemdedservices_item, parent, false);
    RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) itemView.getLayoutParams();
    // 获取RecyclerView可用总宽度
    int recyclerTotalWidth = parent.getWidth();
    // 转换Item的6dp水平外边距为像素值
    float density = parent.getResources().getDisplayMetrics().density;
    int itemHorizontalMargin = (int) (6 * density + 0.5f);
    // 3个Item共占用4段水平边距:最左侧、两个Item之间的2个间隙、最右侧
    int totalHorizontalMargin = itemHorizontalMargin * 4;
    // 计算单个Item的宽度,扣除所有边距后三等分
    int singleItemWidth = (recyclerTotalWidth - totalHorizontalMargin) / 3;
    layoutParams.width = singleItemWidth;
    layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
    itemView.setLayoutParams(layoutParams);
    return new MyViewHolder(itemView);
}

注意事项

  • 如果你的RecyclerView本身设置了水平方向的padding(比如android:paddingHorizontal),计算总宽度时需要把这部分padding的像素值也从recyclerTotalWidth中扣除,否则会出现宽度计算偏差。
  • 如果你给RecyclerView添加了自定义ItemDecoration设置额外的item间距,也要把这部分间距值同步算入总占用宽度,再做三等分计算。
  • 正常场景下上述代码可以直接生效,若极端场景下触发onCreateViewHolder时RecyclerView还未完成测量导致getWidth()返回0,可以把宽度计算逻辑放到itemView.post()中执行即可。

内容的提问来源于stack exchange,提问作者Vivekajee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:42:17