水平recyclerView中的项目无法正确显示,而不是垂直recyclerView中的项目

时间:2019-12-05 14:05:07

标签: android-recyclerview horizontal-recyclerview

具有一个recyclerView,当它垂直放置时,它可以很好地显示项目。但是当将其更改为水平方向时:

recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

该项目显示不正确。一个示例是RelativeLayout中具有

的第三个视图(微调器)
android:layout_alignParentEnd="true"

但是它显示为与父母的左边缘对齐,该边缘应该是右侧对齐的(并且在垂直方向上也是如此)。

enter image description here

水平recyclerView时,某些视图也存在问题,例如textView的宽度超出了父视图的宽度(

<TextView 
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"

,并且在限于其父视图内的垂直recyclerView中工作正常)

使用卧式recyclerView是否需要特殊考虑?

感兴趣的布局是:

        <RelativeLayout
            android:id="@id/container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@id/sponsored_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:singleLine="true"
                android:textIsSelectable="false" />

            <ImageView
                android:id="@id/icon"
                android:layout_width="6dp"
                android:layout_height="6dp"
                android:layout_alignBottom="@id/sponsored_text"
                android:layout_toEndOf="@id/sponsored_text"
                />

            <androidx.appcompat.widget.AppCompatSpinner
                android:id="@id/spinner"
                style="@style/Spinner"
                android:layout_width="200dp"
                android:layout_height="40dp"
                android:layout_alignParentEnd="true"
                android:dropDownWidth="216dp"
                android:spinnerMode="dropdown" />

1 个答案:

答案 0 :(得分:0)

事实证明,对于水平RecyclerView,水平recyclerView的测量行为有所不同,RelativeLayout中的match_parent不起作用。 widthMeasureSpec

中以0传入
onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)

在onMeasure中设置relativeLayout的宽度似乎可行,就像这样:

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) {
            val windowWidth = context.resources.displayMetrics.widthPixels
            containerView?.let {
                val lp = it.layoutParams
                lp.width = windowWidth
            }
        }
                ... ...

        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    }