我知道在StackOverflow中已经以多种不同的方式询问了这一点,但没有一个答案似乎符合我的问题。
正如在这张图片(https://imgur.com/a/9MIlzwe)中可以看到的,我在GridView的底部得到一个丑陋的空间,因为行不会按比例拉伸以覆盖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),然后使用android:adjustViewBounds="true"
作为ImageView,但这没有任何效果。
根据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
试试这个:
在您的活动中找到屏幕的高度:
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);