本篇文章基於 之前的一篇判斷ListView的每一個item高度
直接複用上一篇文章中的setListViewHeightBasedOnChildren方法,當初是使用gridView.getNumColumns();方法,獲取gridview的列數,但是當我斷點看的時候,發現值一直是-1, 而gridview中的mRequestedNumColumns字段反而是正常的, 看看gridview的源碼中的setNumColumns方法,它把mRequestedNumColumns字段賦值了。
/**
* Set the number of columns in the grid
*
* @param numColumns The desired number of columns.
*
* @attr ref android.R.styleable#GridView_numColumns
*/
public void setNumColumns(int numColumns) {
if (numColumns != mRequestedNumColumns) {
mRequestedNumColumns = numColumns;
requestLayoutIfNecessary();
}
}
然後在 determineColumns中也看到了對mNumColumns的賦值。
private boolean determineColumns(int availableSpace) {
final int requestedHorizontalSpacing = mRequestedHorizontalSpacing;
final int stretchMode = mStretchMode;
final int requestedColumnWidth = mRequestedColumnWidth;
boolean didNotInitiallyFit = false;
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;
}
...省略若干行代碼...
}
並且這個值就沒有再改過。不知道爲什麼一直是-1.好吧,暫時先不管,晚上回去再看看。先把問題解決了再說。既然mRequestedNumColumns有值, 那我們直接通過反射拿到這個字段的值吧,看源碼。
public static void setGridViewHeightBasedOnChildren(GridView gridView,
View... views) {
//獲取對應的adapter
ListAdapter listAdapter = gridView.getAdapter();
Class<GridView> tempGridView = GridView.class; // 獲得gridview這個類的class
int column = -1;
try {
Field field = tempGridView.getDeclaredField("mRequestedNumColumns"); // 獲得申明的字段
field.setAccessible(true); // 設置訪問權限
column = Integer.valueOf(field.get(gridView).toString()); // 獲取字段的值
} catch (Exception e1) {
}
if (column == -1)
return;
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i += column) { // 這邊因爲一排column個,所以i
// +=
// column
View listItem = listAdapter.getView(i, null, gridView);
listItem.measure(0, 0); // 計算子項View 的寬高
totalHeight += listItem.getMeasuredHeight(); // 統計所有子項的總高度
}
try {
if (views != null) {
for (View view : views) {
view.measure(0, 0);
totalHeight += view.getMeasuredHeight();
}
}
} catch (Exception e) {
e.printStackTrace();
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = totalHeight
+ (gridView.getHeight() * (listAdapter.getCount() - 1)) + 10;
gridView.setLayoutParams(params);
}
好了,這個時候 gridview的高度就獲得了。當然,我這裏由於業務的需求,直接把高度重新設置到了gridview的身上, 按照自己的需求,修改就行了。
關注我的微信公衆號 Android開發者 微信號: andeoidesigner 或者掃描下方二維碼