RecycleView水平滚动时设置图片item宽高比及适配问题

        RecycleView目前已经取代ListView、GridView成为主流滑动列表首选组件,在各类列表展示中都能一展风采,下面主要讲讲如何设置它的item固定宽高比及适配不同的机型展现统一的样式。

      控制宽高比首选约束布局,它的实现方式最为简洁,重点是设置约束比例:layout_constraintDimensionRatio(注:约束比例要生效,layout_width或者layout_height至少有一个的值需要为0dp,否则约束比例不生效),直接来看看item布局的实现方式吧:

    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="wrap_content">

        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"

        />

此时,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%,因为宽度是根据屏幕获取,故在所有手机上占用宽度都一样,最终实现效果如下图:

你可能感兴趣的:(RecycleView水平滚动时设置图片item宽高比及适配问题)