1.需求描述:
列表分为一列两个,两个子项宽度一致,且左右边距一样,就是要好看,子项宽度适配手机,高度适配宽度。
2.问题描述:
但是我们直接设置的时候,他的子项会在给他的布局的左边,于是我想到了设置下子项的左右边距,但是android手机屏幕太多种类型了,所以在部分手机上,也不大行。
3:解决办法:
既然要匹配手机屏幕宽度,那就让手机宽度来决定子项宽度。
1.在 XML 布局文件中,将 RecyclerView 的宽度设置为 match_parent
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
但是一般的为了美观,都会让列表有边距,这里自行设置
2.在代码中,设置 GridLayoutManager 并应用到 RecyclerView
RecyclerView recyclerView = findViewById(R.id.recyclerView);
GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(layoutManager);
3.创建 RecyclerView 的 Adapter,并在 Adapter 中重写 onCreateViewHolder()
方法(记得是在Adapter里面写代码)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
// 计算子项的宽度
int screenWidth = parent.getContext().getResources().getDisplayMetrics().widthPixels;
int itemWidth = (screenWidth - dpToPx(40)) / 2;
// 设置子项的宽度
view.getLayoutParams().width = itemWidth;
return new ViewHolder(view);
}
private int dpToPx(int dp) {
float density = getResources().getDisplayMetrics().density;//这个getresources需要context对象哈,拿activity的也行,application的也行
return Math.round(dp * density);
}
上面我减去了40dp,就是为了美观点,不然两个子项直接怼一起了,很丑哦~~
这样就可以了。之前是设置decoration,发现不太行,还是得适配手机宽度才行。
当然,如果每个子项的宽会随内容改变,建议使用流布局哈。