Я знаю, что в StackOverflow об этом спрашивали по-разному, но, похоже, ни один из ответов не соответствует моей проблеме.
Как видно на этом рисунке (https://imgur.com/a/9MIlzwe), Я получаюуродливое пространство внизу GridView, потому что строки не растягиваются пропорционально, чтобы покрыть всю высоту GridView. Я пробовал так много разных кодов, что писать их все здесь бесполезно. Вместо этого я сделаю так:показать фрагменты моего кода, который у меня есть в данный момент и который имеет отношение к проблеме.
Сначала я вычисляю размеры GridView перед отображением изображений внутри него. Мне нужны 3 столбца и 3 строки, поэтомувнутри setDimensions я делю на COLUMNS в обоих случаях (потому что это константа int со значением 3):
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