Java 实现grid RecyclerView的最佳方法,其中项目是方形图像,下面有一些文本

Java 实现grid RecyclerView的最佳方法,其中项目是方形图像,下面有一些文本,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在开发一个音乐商店,在那里我们以网格形式展示专辑。每个项目由封面相册(方形图像)和下面的一些文本组成,其中显示艺术家姓名、相册名称等。这是我想要的近似结果: 封面图片不是单一尺寸的,有些是1000x1000,有些是500x500,也许还会有其他尺寸 这是我用于每个项目的当前xml布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com

我正在开发一个音乐商店,在那里我们以网格形式展示专辑。每个项目由封面相册(方形图像)和下面的一些文本组成,其中显示艺术家姓名、相册名称等。这是我想要的近似结果:

封面图片不是单一尺寸的,有些是1000x1000,有些是500x500,也许还会有其他尺寸

这是我用于每个项目的当前xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/cover"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/artistName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>
我得到这个结果:

右图为500x500,另外两幅为1000x1000

但是,如果我添加一些调整大小的图像

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.artistName.setText(mAlbums.get(position).name);

    Picasso.with(holder.cover.getContext())
            .load(mAlbums.get(position).primaryImage)
            .resize(300, 300)
            .centerInside()
            .into(holder.cover);
}
我会得到更好的结果,比如:

300只是一个随机数。我可以用屏幕宽度/3替换它


所以。。。。有没有更好的方法来解决这个问题(我认为这在应用程序中是一个非常普遍的问题)?

对类似xml的项目使用固定高度

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="100dp">

    <ImageView
        android:id="@+id/cover"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/artistName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>


希望这能解决这个问题

对xml之类的项目使用固定高度

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="100dp">

    <ImageView
        android:id="@+id/cover"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/artistName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>


希望这能解决问题

您可以这样做。关于你的活动/片段

private void setRecyclerView() {
    productRecyclerView.setHasFixedSize(true);
    final GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 3);
    productRecyclerView.setLayoutManager(layoutManager);
    recyclerViewAdapter = new ProductListAdapter(getActivity());
    productRecyclerView.setAdapter(recyclerViewAdapter);
}

或者,您可以通过添加不同行/列高度的不同视图保持架来实现。

您可以这样做。关于你的活动/片段

private void setRecyclerView() {
    productRecyclerView.setHasFixedSize(true);
    final GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 3);
    productRecyclerView.setLayoutManager(layoutManager);
    recyclerViewAdapter = new ProductListAdapter(getActivity());
    productRecyclerView.setAdapter(recyclerViewAdapter);
}

或者,您可以通过添加不同行/列高度的不同视图保持架来实现

package net.simplyadvanced.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

/** A RelativeLayout that will always be square -- same width and height,
 * where the height is based off the width. */
public class SquareRelativeLayout extends RelativeLayout {

public SquareRelativeLayout(Context context) {
    super(context);
}

public SquareRelativeLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SquareRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@TargetApi(VERSION_CODES.LOLLIPOP)
public SquareRelativeLayout(Context context, AttributeSet attrs,         int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // Set a square layout.
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}

}
看看答案

使用以下平方相对长度

package net.simplyadvanced.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

/** A RelativeLayout that will always be square -- same width and height,
 * where the height is based off the width. */
public class SquareRelativeLayout extends RelativeLayout {

public SquareRelativeLayout(Context context) {
    super(context);
}

public SquareRelativeLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SquareRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@TargetApi(VERSION_CODES.LOLLIPOP)
public SquareRelativeLayout(Context context, AttributeSet attrs,         int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // Set a square layout.
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}

}
看看答案