回收视图中的wrap_content,获取项目高度(水平列表)

6

我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个水平滚动条(RecycleView),现在我希望该滚动条的高度能够与视图中某个项目的高度相匹配。但事先我并不知道该高度。

目前我的代码如下:

Main fragment:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="horizontal"
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginTop="1dp"
        android:layout_gravity="top"
        android:id="@+id/my_listview"/>

</RelativeLayout>


<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

图片

<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/banner_image"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    android:background="@color/dark_gray"
    />

但它总是占据整个屏幕,所以在其间有很多空格。我能否在recycleview项目上使用wrap_content?以下是当前情况的截图:enter image description here 我已经放置了两个横幅,顶部的带有大空白和小图像的是带有recyclerview的横幅。下面那个只是放置在imageview中的图像(应该是这样的),但我想要一个带有recyclerview的横幅,以便可以滚动浏览多个横幅。

你已经使用height="match_parent"定义了你的recyclerView。当你将其替换为"wrap_content"时会发生什么? - Gil Moshayof
然后它会采用不正确的高度,横幅大约测量高度为60px,但使用wrap_content将使其调整大小到约30或其他值。 - Maxim
1
如果你将recyclerView的高度定义为wrap_content,并从ImageView中删除scaleTypeadjustViewBounds,会发生什么? - Andrei Catinean
我已经完成了,现在它保持不变。我更新了原始帖子,并附上了一个图片以展示其外观。 - Maxim
4个回答

1

现在我希望高度与视图中的某个项目的高度匹配。我事先不知道高度。

在布局过程中,LinearLayoutManager 无法提前预测适配器中尚未创建的所有视图的高度。

您可以通过代码对 RecycleView 的高度进行设置,但需要先通过 measure() 方法测量适配器中的一个项目视图,通常是第一个。

如果所有项目的高度都不同,则必须测量它们所有的高度,这显然不是良好 UI 的正确方式。


所有图片尺寸均相同。 - Maxim

0

我也遇到了同样的问题,我想在RecyclerView中以两列的形式查看两个大小相同的图像,然后我通过使用下面的代码解决了这个问题。请尝试一下。

// inner class to hold a reference to each item of RecyclerView 
    public static class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView imgViewIcon;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
            imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
            int colSpan = 2;
            imgViewIcon.getLayoutParams().height = (int) (displayMetrics.widthPixels / colSpan);
            imgViewIcon.getLayoutParams().width = (int) (displayMetrics.widthPixels / colSpan);

        }
    }

0

你可能没有正确地填充布局。

你使用了吗?

layoutInflater.inflate(R.layout.your_layout, null);

尝试使用代替。 (另一种方法会影响测量)

layoutInflater.inflate(R.layout.your_layout, parent, false);

我目前正在使用以下代码进行膨胀:View v = LayoutInflater.from(mContext).inflate(R.layout.banner_item, parent, false); - Maxim

0

你把RecycleView放在RelativeLayout里面有什么原因吗?我建议先把RecycleView移出RelativeLayout

其次,我看到你的ViewPager有一个layout_weight属性,但是父布局中没有android:weightSum属性。你为什么要指定ViewPager有一个weight属性,而不是RecycleView?你是否尝试过将RecyleView的大小固定为一些dp,以检查排列是否正确,ViewPager是否正确使用了weight属性?

第三,我建议你尝试调整Imageview。也许可以将其包装在RelativeLayout中?你需要尝试不同的参数,看看是否适合你的需求。因为你想要自定义的东西,所以这个问题没有一个直接的答案。


谢谢您的回复,很遗憾您提供的建议都没有起作用。当将其设置为固定的dp大小时,空白区域似乎会相应地缩小到设置的dp大小。 - Maxim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接