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
相关产品推荐
相关产品推荐

