在Android中使用带有StaggeredGridLayoutManager的RecyclerView时,单元格不会交错

时间:2016-05-29 18:10:16

标签: android android-recyclerview android-cardview staggered-gridview staggeredgridlayout

我正在开发一款Android应用。我在Android开发方面不擅长。在我的应用程序中,我使用RecyclerView和CardView与StaggeredGridLayoutManager。因为我希望列表中的每个单元格大小彼此不同并且如下图所示交错。

file format

但是当我运行我的应用程序时,细胞不会交错,它们的大小相等。

这是截图

documentation

这是我的回收者视图XML

<android.support.v7.widget.RecyclerView
        android:id="@+id/df_rv_destination"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

这是单元格项目的XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/di_iv_image"
            android:scaleType="centerCrop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:textSize="17dp"
            android:textColor="@color/white"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginBottom="10dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:id="@+id/di_tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>
</android.support.v7.widget.CardView>

这是我使用StaggerGridLayoutManager

配置RecyclerView的方法
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, 1);
        rcDestinations.setLayoutManager(staggeredGridLayoutManager);
        rcDestinations.setItemAnimator(new DefaultItemAnimator());
        regionsList = new ArrayList<Region>();
        destinationsAdapter = new DestinationsAdapter(getActivity(),regionsList);
        rcDestinations.setAdapter(destinationsAdapter);

那么为什么我的RecyclerView不会错开?我该如何解决?

3 个答案:

答案 0 :(得分:1)

你的细胞物品都有相同的尺寸,因为没有任何东西可以改变尺寸...我想你想要更大的物品,如果你有更大的照片

首先改变这一点:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

到此:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

然后代替:

<ImageView
        android:id="@+id/di_iv_image"
        android:scaleType="centerCrop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

尝试:

<ImageView
        android:id="@+id/di_iv_image"
        android:scaleType="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

并在添加之前将图像高度缩放到您希望的尺寸;) 使用cropCenter,您可以将图像裁剪为相同尺寸

666

答案 1 :(得分:1)

使用android:adjustViewBounds="true"

设置您的图片视图

答案 2 :(得分:-1)

您需要强制调整高度以获得所需的效果。

我正在使用数据绑定,所以设置高度如下:

public int getHeight(int position) {
    Random r = new Random();
    int randomHeight = r.nextInt(Math.abs(mRecyclerViewHeight)/9) + Math.abs(mRecyclerViewHeight)/4;
    if(position%2 == 0){
        randomHeight += Math.abs(mRecyclerViewHeight)/9;
    }
    return randomHeight;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {


        ((DiscoveryViewHolder) holder).bindRepository(mPostList.get(position), getHeight(position));

保持器).bindRepository(mPostList.get(位置));     }