Android:GridView auto_fit如何find列数?

我想更好地理解Gridview是如何工作的,特别是auto_fit 。 这是XML布局:

 <?xml version="1.0" encoding="utf-8"?> <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:columnWidth="60dp" android:numColumns="auto_fit" /> 

它可以很好地处理一系列六个缩略图(48 * 48像素)。 在肖像模式下,它显示一行六列。

同

我不明白的是为什么行android:columnWidth="60dp"是必要的,因为auto_fit预计会find正确的列数。
没有行android:columnWidth="60dp" ,它显示一个网格3行2列。

无

这里是ImageAdapter类:

 package com.examples.HelloGridView; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; public class ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context c) { mContext = c; } public int getCount() { return mThumbIds.length; } 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.setPadding(0, 0, 0, 0); } else { imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return imageView; } // references to our images private Integer[] mThumbIds = { R.drawable.ic_1, R.drawable.ic_2, R.drawable.ic_3, R.drawable.ic_4, R.drawable.ic_5, R.drawable.ic_6 }; } 

感谢您的帮助。

看看GridView的源代码,很显然,在你的ImageView上设置填充和高度对你根本没有任何帮助。 没有指定列宽时,只select预设数量的列(2):

  private void determineColumns(int availableSpace) { ... if (mRequestedNumColumns == AUTO_FIT) { if (requestedColumnWidth > 0) { // Client told us to pick the number of columns mNumColumns = (availableSpace + requestedHorizontalSpacing) / (requestedColumnWidth + requestedHorizontalSpacing); } else { // Just make up a number if we don't have enough info mNumColumns = 2; } } else { // We picked the columns mNumColumns = mRequestedNumColumns; } if (mNumColumns <= 0) { mNumColumns = 1; } ... 

解决方法是在设置GridView的列宽之前测量列大小。 这是一个快速测量屏幕外观的方法:

 public int measureCellWidth( Context context, View cell ) { // We need a fake parent FrameLayout buffer = new FrameLayout( context ); android.widget.AbsListView.LayoutParams layoutParams = new android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); buffer.addView( cell, layoutParams); cell.forceLayout(); cell.measure(1000, 1000); int width = cell.getMeasuredWidth(); buffer.removeAllViews(); return width; } 

然后你只需设置GridView的列宽:

 gridView.setColumnWidth( width ); 

根据android:numColumns文档

auto_fit显示尽可能多的列以填充可用空间。

所以如果你插入ImageView

padding设置zero

margin设置zero

layout_width设置为wrap_content

layout_height设置为wrap_content

gridView应该包含尽可能多的子元素


记住你的ImageViews可能正在缩小(:

这可能有助于某人…您需要手动查找宽度大小。 根据宽度大小可以设置栏

  float scalefactor = getResources().getDisplayMetrics().density * 100; int number = getWindowManager() .getDefaultDisplay().getWidth(); int columns = (int) ((float) number / scalefactor) / 2; if (columns == 0 || columns == 1) columns = 2; gridView.setNumColumns(columns); 

我发现我通常知道我想要我的列有多宽。 要么我知道我的照片的大小,要么让用户确定这个尺寸。 因此,我可以在我的活动中设置宽度:

  gridview = (GridView) findViewById(R.id.gridview); SharedPreferences mySettings; mySettings = getSharedPreferences(Constants.PREFERENCES, Context.MODE_PRIVATE); int gridSize = 50 * Integer.parseInt(mySettings.getString("gridSize", "3")); gridview.setColumnWidth(gridSize + 10); 

就这样 。 。 。

来自琉森,斯蒂芬的问候

“wrap_content”的作用就像文字编辑器的文字换行一样 – 如果图像不适合最后一列的大小,图像将stream向下一行。 但是,如果将numcolumns属性设置为数字,则网格可能会拉伸/调整列(stretchModde是您可能要结合使用的另一个属性)。

ps – 虽然你已经勾选了答案,很高兴知道这是否有帮助。