0

我想制作一个包含 75dp 宽度和 75dp 高度的图像视图的 GridView。而且我希望这个正方形填充屏幕大小,中间没有空格。现在我只使用 500 计数。所以它随机打印500个正方形图像。它没有填满空间。请查看下图了解平板电脑版本。

在此处输入图像描述

这是我的适配器:

    public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return 500;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 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) { // if it's not recycled, initialize some
            // attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(75, 75));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(0, 0, 0, 0);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(R.drawable.sample_0);
        return imageView;
    }

}
4

2 回答 2

0

In getCount you could divide the area of the screen by the area of the squares you're filling it with.

public int getCount() {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int area = size.x * size.y;
    // TODO: you may want to pass in the square dimensions or make them constants
    return area / (75 * 75);
}

Of course, this isn't right, since it uses the display and not the parent ViewGroup. Instead of trying to do this all in the adapter, have the constructor for this take in the dimensions of the parent and do the math there, saving an instance variable with the count:

private int numBoxes = 0;
private static final SQUARE_SIZE = 75;
public ImageAdapter(Context c, ViewGroup parent) {
    mContext = c;
    numBoxes = (parent.getWidth() * parent.getHeight()) / (SQUARE_SIZE * SQUARE_SIZE);
}
public int getCount() {
    return numBoxes;
}
于 2013-05-30T21:13:39.030 回答
0

扩展尼克怀特的答案,您需要确保在获得高度和宽度之前已经布置了父布局。如果父宽度和/或高度是“wrap_content”或“match_parent”,如果适配器是在 Activity onCreate() 中创建的,那么 getHeight() 和 getWidth() 将在适配器的构造函数中返回零。

这个答案提供了一种监听 onLayout 事件和处理大小的方法。我确实尝试过做类似的事情,但我发现在我的案例中结果并不完美,因为在我应用大小更改后网格会绘制然后重绘。到目前为止,我在调整网格大小方面获得的最佳结果是使用合格的资源值来调整网格内的图像视图大小。然后通过在 values-xxx 资源文件夹中创建各种值来根据屏幕密度或大小设置资源大小值。

就我而言,我通过应用以下内容来更改单元格图像的大小以使某个数字适合屏幕:

整数大小 = getResources().getInteger(R.int.image_size));

imageView.setLayoutParams(新 GridView.LayoutParams(大小,大小));

应该可以做类似的事情来计算屏幕大小的列数。

于 2013-08-22T10:55:18.303 回答