【问题标题】:Remove space between rows in GridView删除 GridView 中的行之间的空间
【发布时间】:2019-04-10 08:12:45
【问题描述】:

我知道在 StackOverflow 中以许多不同的方式提出了这个问题,但似乎没有一个答案适合我的问题。

从这张图片 (https://imgur.com/a/9MIlzwe) 中可以看出,我在 GridView 的底部得到了一个难看的空间,因为行没有按比例拉伸以覆盖 GridView 的所有高度。我已经尝试了很多不同的代码,所以在这里写它们是没有用的。我要做的是展示我目前拥有的与问题相关的代码片段。

在显示其中的图像之前,我首先计算 GridView 的尺寸。我想要 3 列和 3 行,这就是为什么在 setDimensions 中我在两种情况下都除以 COLUMNS(因为它是一个值为 3 的常量 int):

private void setDimensions() {

    ViewTreeObserver vto = mGridView.getViewTreeObserver();     

    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {           
        @Override
        public void onGlobalLayout() {
            mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this);         

            int displayWidth = mGridView.getMeasuredWidth();          
            int displayHeight = mGridView.getMeasuredHeight();

            mColumnWidth = displayWidth / COLUMNS;
            mColumnHeight = displayHeight / COLUMNS;

            display(getApplicationContext());
        }
    });
}




private static void display(Context context) {
    ArrayList<ImageView> imgs = new ArrayList<>();
    ImageView image;


    /*

    ...More code
     */

    mGridView.setAdapter(new CustomAdapter(imgs, mColumnWidth, mColumnHeight));
}

我的适配器类的getView()方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {            

    ImageView imageView;

    if (convertView == null) {
        imageView = imgs.get(position);
    } else {
        imageView = (ImageView) convertView;
    }


    android.widget.AbsListView.LayoutParams params = new android.widget.AbsListView.LayoutParams(mColumnWidth, AbsListView.LayoutParams.WRAP_CONTENT);        
    imageView.setLayoutParams(params);


    return imageView;
}

我在搜索它时多次遇到的解决方案之一是为视图(在本例中为 ImageView)膨胀布局,然后为 ImageView 使用android:adjustViewBounds="true",但这没有效果.

按照 Ferran 的要求,这是我尝试膨胀 ImageView 的代码:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_centerInParent="true"
    android:scaleType="fitXY"
    android:adjustViewBounds="true"
    />

上面的代码将与此结合:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView;

    if (convertView == null) {

        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        imageView = (ImageView) layoutInflater.inflate(R.layout.image_item, parent, false);

    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setMinimumHeight(mColumnHeight/3);
    imageView.setMinimumWidth(mColumnWidth/3);


    return imageView;
}

结果将是白屏死机:https://imgur.com/a/GJXRsxV

【问题讨论】:

  • 您想增加行间距还是拉伸图像以填满整个可用空间(这会改变比例)?
  • 您好@Ferran 我想拉伸图像以填充整个可用空间,我不在乎是否会丢失比例。但我想让行平均伸展。尽管我不关心图片的拉伸,但我确实需要行的高度相同。
  • 试试这个:- 在你的 ImageView 中添加这个--> android:adjustViewBounds="true"
  • @ChaudharyAmar 请检查最后一段

标签: android android-imageview baseadapter android-gridview


【解决方案1】:

试试这个:

在您的 Activity 中找到屏幕的高度:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

scrHeight = metrics.heightPixels;

然后,在您的适配器中,设置项目的最小高度

itemView = inflater.inflate(R.layout.item, null); // the layout of your item
itemView.setMinimumHeight(scrHeight/3);

【讨论】:

  • 我已经尝试过该解决方案。这就是我从中得到的:imgur.com/a/pJA8wKV
  • 所以,请分享您的项目布局 xml。
  • 代码更新@Ferran 我之前给你看的照片没有项目布局(我不需要它,因为它只是一个 ImageView)。但是,如果我夸大 ImageView 布局,我会立即得到一个白屏死机
  • 好的,查看您的第一个getView,您正在将LayoutParams 设置为WRAP_CONTENT,那么改用MATCH_PARENT 怎么样?
  • 是的,但我的意思是不要夸大布局。