Android GridView在越来越小的屏幕设备上无法正常运行

时间:2017-08-23 21:14:45

标签: android gridview

我的Android应用中有一个GridView,它有图像。我在GridView中有10行和2列。有了这个,我在每个网格中都有相同大小的图像,即20个图像。

网格代码是,

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:columnWidth="140dp"
android:drawSelectorOnTop="true"
android:gravity="center"
android:numColumns="2"
android:stretchMode="columnWidth"
android:verticalSpacing="5dp"
android:focusable="true"
android:clickable="true"
/>

同时在java代码中,我使用了一个Adapter。这是使用scaleType

设置单个网格大小和图像的代码
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(340, 400));
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        imageView.setPadding(10, 10, 10, 10);

它在设备屏幕尺寸5'0上工作正常,但在其他设备上,如5'7,4'5,它的工作方式不同。网格(及其各个图像)有些隐藏/裁剪。即使在5'0以下,它也显示出一些额外的空间,看起来很差。

GridView如何在不同的屏幕尺寸上正常工作。

这是一个样本,它在5'7中看起来如何,

5'7 screen size

这是一个样本,它在5'0中看起来如何。 这就是我希望它在每个屏幕尺寸上都可见的方式。

5'0 screen size

这是一个样本,它在4'0中看起来如何。这里的图像重叠了。

4'0 screen size

2 个答案:

答案 0 :(得分:1)

您可以在适配器中使用与ViewView相同的GridView项目视图,如下所示:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.item_grid, null);

        holder = new ViewHolder();
        holder.mImage = (ImageView) convertView.findViewById(R.id.img);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.mImage.setImageResource(imageIDs[position]);
    return convertView;
}

public class ViewHolder {
    private ImageView mImage;
}

我创建了item_grid,如下所示:

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

    <ImageView
        android:id="@+id/grid_image"
        android:layout_width="match_parent"
        android:layout_height="130dp" />
</LinearLayout>

建议:您可以将RecyclerView与GridLayoutManager一起使用2列

答案 1 :(得分:0)

此代码在适配器中对我来说就像一个魅力:

// create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  

            //Calculation of ImageView Size - density independent.
            //maybe you should do this calculation not exactly in this method but put is somewhere else.
            Resources r = Resources.getSystem();
            float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, r.getDisplayMetrics());


            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams((int)px, (int)px));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            //imageView.setPadding(8, 8, 8, 8);
            imageView.setBackgroundColor(Color.BLUE);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }

来源: https://stackoverflow.com/a/11485625/7639113

添加上面的代码后,我还为更大的屏幕创建了不同的布局,如下所示:

  

normal_layout.xml

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:numColumns="2"
android:verticalSpacing="5dp"
/>
  

bigscreen_layout.xml

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:numColumns="4"
android:verticalSpacing="5dp"
/>

请注意,我为上面的布局设置了不同的numColumns。

以下是我为不同屏幕尺寸创建布局的方法:

  1. 在res中创建新的Android资源目录
    1. 将资源类型更改为布局,为可用限定符选择最小屏幕宽度,然后单击“&gt;&gt;”
      1. 在最小屏幕宽度中填写600,Android Studio将自动生成layout-sw600dp目录。单击“确定”。
        1. 现在,您只需将 normal_layout.xml 放在布局目录中,并将 bigscreen_layout.xml 放在layout-sw600dp目录中。
        2. 您可以在官方Android指南Supporting Multiple Screens中查看不同的屏幕尺寸详细信息: