下面列出了android.widget.GridView#getLayoutParams ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* 日期gridview的高度
* @param gridView
* @return
*/
public static int setDateGridViewHeightBasedOnChildren(GridView gridView) {
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
// pre-condition
return 0;
}
int totalHeight = 0;
for (int i = 0; i < (listAdapter.getCount()/7); i++) {
View listItem = listAdapter.getView(i, null, gridView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = totalHeight + (1 * (listAdapter.getCount()/7 - 1));
gridView.setLayoutParams(params);
return totalHeight + (1 * (listAdapter.getCount()/7 - 1));
}
/**
* 重新計算GridView的高度
*
* @param gridView
*/
public static void setGridViewHeightBasedOnChildren(GridView gridView, int columns) {
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount() / columns; i++) {
View listItem = listAdapter.getView(i, null, gridView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = totalHeight + (listAdapter.getCount() - 1);
gridView.setLayoutParams(params);
gridView.requestLayout();
}
public static void setListViewHeightBasedOnChildren(GridView listView) {
// 获取listview的adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
// 固定列宽,有多少列
int col = 3;// listView.getNumColumns();
int totalHeight = 0;
// i每次加4,相当于listAdapter.getCount()小于等于4时 循环一次,计算一次item的高度,
// listAdapter.getCount()小于等于8时计算两次高度相加
for (int i = 0; i < listAdapter.getCount(); i += col) {
// 获取listview的每一个item
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
// 获取item的高度和
totalHeight += listItem.getMeasuredHeight();
}
// 获取listview的布局参数
ViewGroup.LayoutParams params = listView.getLayoutParams();
// 设置高度
params.height = totalHeight;
// 设置margin
((MarginLayoutParams) params).setMargins(10, 10, 10, 10);
// 设置参数
listView.setLayoutParams(params);
}
/**
* Resizes the gridview.
* @param gridView
* @param items count
* @param columns column number
*/
public static void resizeGridView(GridView gridView, int columns) {
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
int items = listAdapter.getCount();
int rows = 0;
int maxHeight = 0;
for(int i = 0; i< listAdapter.getCount(); i++ ){
View listItem = listAdapter.getView(i, null, gridView);
listItem.measure(0, 0);
totalHeight = listItem.getMeasuredHeight();
if(maxHeight < totalHeight){
maxHeight = totalHeight;
}
}
float x = 1;
if( items > columns ){
x = items/columns;
rows = (int) (x + 1);
maxHeight *= rows;
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = maxHeight;
gridView.setLayoutParams(params);
}
/**
* Resizes the gridview.
* @param gridView
* @param items count
* @param columns column number
*/
public static void resizeGridView(GridView gridView, int columns) {
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
int items = listAdapter.getCount();
int rows = 0;
int maxHeight = 0;
for(int i = 0; i< listAdapter.getCount(); i++ ){
View listItem = listAdapter.getView(i, null, gridView);
listItem.measure(0, 0);
totalHeight = listItem.getMeasuredHeight();
if(maxHeight < totalHeight){
maxHeight = totalHeight;
}
}
float x = 1;
if( items > columns ){
x = items/columns;
rows = (int) (x + 1);
maxHeight *= rows;
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = maxHeight;
gridView.setLayoutParams(params);
}
/**
* 计算 GridView 高度
* @param gridView {@link GridView}
* @param setParams 是否 setLayoutParams
* @return GridView 高度
*/
public static int calcGridViewHeight(final GridView gridView, final boolean setParams) {
if (gridView == null) return 0;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) return 0;
try {
// Adapter
ListAdapter listAdapter = gridView.getAdapter();
// Item 总条数
int itemCount = listAdapter.getCount();
// 没数据则直接跳过
if (itemCount == 0) return 0;
// 高度
int height = 0;
// 获取一共多少列
int numColumns = gridView.getNumColumns();
// 每列之间的间隔 |
int horizontalSpacing = gridView.getHorizontalSpacing();
// 每行之间的间隔 -
int verticalSpacing = gridView.getVerticalSpacing();
// 获取倍数 ( 行数 )
int lineNumber = NumberUtils.getMultiple(itemCount, numColumns);
// 计算总共的宽度 - (GridView 宽度 - 列分割间距 ) / numColumns
int childWidth = (gridView.getWidth() - (numColumns - 1) * horizontalSpacing) / numColumns;
// 记录每行最大高度
int[] rowHeightArrays = new int[lineNumber];
// 临时高度 - 保存行中最高的列高度
int tempHeight;
// 循环每一行绘制每个 Item 并保存 Bitmap
for (int i = 0; i < lineNumber; i++) {
// 清空高度
tempHeight = 0;
// 循环列数
for (int j = 0; j < numColumns; j++) {
// 获取对应的索引
int position = i * numColumns + j;
// 如果大于总数据则跳过
if (position < itemCount) {
View childView = listAdapter.getView(position, null, gridView);
WidgetUtils.measureView(childView, childWidth);
int itemHeight = childView.getMeasuredHeight();
// 保留最大高度
tempHeight = Math.max(itemHeight, tempHeight);
}
// 记录高度并累加
if (j == numColumns - 1) {
height += tempHeight;
rowHeightArrays[i] = tempHeight;
}
}
}
// 追加子项间分隔符占用的高度
height += (verticalSpacing * (lineNumber - 1));
// 是否需要设置高度
if (setParams) {
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = height;
gridView.setLayoutParams(params);
}
return height;
} catch (Exception e) {
LogPrintUtils.eTag(TAG, e, "calcGridViewHeight");
}
return 0;
}
/**
* 计算gridview的高度
* @param gridView
*/
public static void setGridViewHeightBasedOnChildren(GridView gridView) {
// 获取GridView对应的Adapter
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
return;
}
int rows;
int columnWidths;
int columns=0;
int horizontalBorderHeight = 0;
int verticalBorderHeight = 0;
Class<?> clazz=gridView.getClass();
try {
//利用反射,取得横向分割线高度
Field vertical=clazz.getDeclaredField("mVerticalSpacing");
vertical.setAccessible(true);
verticalBorderHeight =(Integer)vertical.get(gridView);
//利用反射,取得纵向分割线高度
Field horizontalSpacing=clazz.getDeclaredField("mRequestedHorizontalSpacing");
horizontalSpacing.setAccessible(true);
horizontalBorderHeight=(Integer)horizontalSpacing.get(gridView);
//利用反射,取得每行显示的个数
Field column=clazz.getDeclaredField("mRequestedNumColumns");
column.setAccessible(true);
columns=(Integer)column.get(gridView);
if(columns == -1 || columns == 0){
Field columnWidth = clazz.getDeclaredField("mRequestedColumnWidth");
columnWidth.setAccessible(true);
columnWidths = (Integer)columnWidth.get(gridView);
int pad = gridView.getPaddingLeft() * 2;
int width = BaseActivity.width - pad * 2;
columns = width / (columnWidths /*+ horizontalBorderHeight*/);
if(horizontalBorderHeight * (columns - 1) + columnWidths * columns > width){
columns --;
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
//判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行
if(listAdapter.getCount()%columns > 0){
rows=listAdapter.getCount()/columns+1;
}else {
rows=listAdapter.getCount()/columns;
}
int totalHeight = 0;
for (int i = 0; i < rows; i++) { //只计算每项高度*行数
View listItem = listAdapter.getView(i, null, gridView);
listItem.measure(0, 0); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = totalHeight + gridView.getPaddingTop() + + gridView.getPaddingBottom() + verticalBorderHeight * (rows-1);//最后加上分割线总高度
gridView.setLayoutParams(params);
}
public static RelativeLayout get(Context context, SharedPreferences options) {
RelativeLayout mainLayout = new RelativeLayout(context);
LayoutInflater layoutInflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
addDockBar(mainLayout, layoutInflater, options);
boolean kitkatNoImmersiveMode = (Build.VERSION.SDK_INT == 19 && !options.getBoolean(Keys.FULLSCREEN, false));
FrameLayout mainBar = (FrameLayout) layoutInflater.inflate(R.layout.main_bar, mainLayout, false);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(mainBar.getLayoutParams());
GridView grid = (GridView) layoutInflater.inflate(R.layout.apps_grid, mainLayout, false);
initAppsGrid(grid, options);
if (options.getBoolean(Keys.BOTTOM_MAIN_BAR, true)) {
layoutParams.addRule(RelativeLayout.ABOVE, R.id.dock_bar);
mainBar.setLayoutParams(layoutParams);
mainLayout.addView(mainBar);
if (kitkatNoImmersiveMode) {
mainLayout.addView(getFakeStatusBar(mainLayout, layoutInflater, options));
}
layoutParams = new RelativeLayout.LayoutParams(grid.getLayoutParams());
if (kitkatNoImmersiveMode) {
layoutParams.addRule(RelativeLayout.BELOW, R.id.kitkat_status_bar);
} else {
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
}
layoutParams.addRule(RelativeLayout.ABOVE, R.id.main_bar);
grid.setLayoutParams(layoutParams);
mainLayout.addView(grid);
} else {
if (!kitkatNoImmersiveMode) {
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
} else {
mainLayout.addView(getFakeStatusBar(mainLayout, layoutInflater, options));
layoutParams.addRule(RelativeLayout.BELOW, R.id.kitkat_status_bar);
}
mainBar.setLayoutParams(layoutParams);
mainLayout.addView(mainBar);
layoutParams = new RelativeLayout.LayoutParams(grid.getLayoutParams());
layoutParams.addRule(RelativeLayout.ABOVE, R.id.dock_bar);
layoutParams.addRule(RelativeLayout.BELOW, R.id.main_bar);
grid.setLayoutParams(layoutParams);
mainLayout.addView(grid);
}
if (options.getBoolean(Keys.HIDE_MAIN_BAR, false)) {
mainBar.setVisibility(View.GONE);
}
mainBar.setBackgroundColor(options.getInt(Keys.BAR_BACKGROUND, 0x22000000));
return mainLayout;
}