RecycleView目前已经取代ListView、GridView成为主流滑动列表首选组件,在各类列表展示中都能一展风采,下面主要讲讲如何设置它的item固定宽高比及适配不同的机型展现统一的样式。
控制宽高比首选约束布局,它的实现方式最为简洁,重点是设置约束比例:layout_constraintDimensionRatio(注:约束比例要生效,layout_width或者layout_height至少有一个的值需要为0dp,否则约束比例不生效),直接来看看item布局的实现方式吧:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="centerCrop"
android:src="@drawable/img"
app:layout_constraintDimensionRatio="h,16:9"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
</android.support.constraint.ConstraintLayout>
此时,item是铺满整个布局,只是根据图片的宽度保持了宽高比,当设置RecycleView水平滚动时,图片宽度会占满一个屏幕,需要设置item的宽度。如果设置固定值,则在不同手机上同一屏展示的item数量可能会不同,此时在adapter初始化实例的时候,onCreateViewHolder方法中强行设置item的宽度,比如设置为屏幕宽度的40%,具体实现如下:
//加载item 的布局 创建ViewHolder实例
@Override
public ViewHolderonCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_horizontal_img, parent,false);
ConstraintLayout.LayoutParams param =new ConstraintLayout.LayoutParams(view.getLayoutParams());
WindowManager wm = (WindowManager) parent.getContext().getSystemService(parent.getContext().WINDOW_SERVICE);
DisplayMetrics dm =new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; // 屏幕宽度(像素)
param.width = (int)(width*0.4);
view.setLayoutParams(param);
ViewHolder holder =new ViewHolder(view);
return holder;
}
设置完成以后item所占宽度为屏幕的40%,因为宽度是根据屏幕获取,故在所有手机上占用宽度都一样,最终实现效果如下图: