我想制作一个包含75dp宽度和75dp高度imageView的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;
}
}
答案 0 :(得分:0)
在getCount
中,您可以将屏幕区域除以您填充它的方块区域。
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);
}
当然,这是不对的,因为它使用的是显示而不是父ViewGroup。不要试图在适配器中完成所有操作,而是让构造函数接受父项的维度并在那里进行数学计算,保存带有计数的实例变量:
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;
}
答案 1 :(得分:0)
扩展Nick White的答案,你需要确保在获得高度和宽度之前已经布局了父布局。如果父宽度和/或高度是“wrap_content”或“match_parent”,则getHeight()和getWidth()将在适配器的构造函数中返回零,如果在Activity onCreate()中创建适配器。
这个answer提供了一种监听onLayout事件和处理大小调整的方法。我确实试着做类似的事情,但我发现在我的情况下结果并不完美,因为在应用尺寸变化后网格会绘制然后重绘。到目前为止,我对网格大小调整的最佳结果是使用合格的资源值来调整网格内的图像视图的大小。然后,通过在values-xxx资源文件夹中创建各种值,根据屏幕密度或大小设置资源大小值。
在我的情况下,我正在改变单元格图像的大小,通过应用以下内容使某个数字适合屏幕:
整数大小= getResources()。getInteger(R.int.image_size));
imageView.setLayoutParams(new GridView.LayoutParams(size,size));
应该可以做类似的事情来计算屏幕尺寸的列数。