Android 根据单元格数量可变宽度GridView

Android 根据单元格数量可变宽度GridView,android,android-layout,gridview,layout,android-linearlayout,Android,Android Layout,Gridview,Layout,Android Linearlayout,继续这个问题 我有一个网格。它有不同的宽度,这取决于用户所做的。有时可能是4*3,有时是2*5 宽度也可以大于4 我的问题是网格本身总是相同的宽度,单元格会拉伸以填充网格。这意味着2*5的单元格宽度是4*3单元格宽度的两倍。理想情况下,我希望调整网格宽度。它应该是columnWidth*numOfColumns 下面我的xml的宽度为175px,我认为这是造成这种情况的原因。当我让它包装内容时,它占据了整个屏幕的宽度,并且忽略了我的两个填充视图 有人能帮忙吗? 谢谢 为了进一步澄清我想要什么

继续这个问题

我有一个网格。它有不同的宽度,这取决于用户所做的。有时可能是4*3,有时是2*5

宽度也可以大于4

我的问题是网格本身总是相同的宽度,单元格会拉伸以填充网格。这意味着2*5的单元格宽度是4*3单元格宽度的两倍。理想情况下,我希望调整网格宽度。它应该是columnWidth*numOfColumns

下面我的xml的宽度为175px,我认为这是造成这种情况的原因。当我让它包装内容时,它占据了整个屏幕的宽度,并且忽略了我的两个填充视图

有人能帮忙吗? 谢谢


为了进一步澄清我想要什么

上半部分包含一个网格,理想情况下应居中。 单元格应具有相同的宽度(理想情况下高度相同,因此为正方形) 在线性布局下方有一个列表,如果网格占用太多空间,则上面的列表应变小(但绝对不能占用超过50%的屏幕)


您需要将
网格视图的宽度设置为
包裹内容
居中水平=“true”
,然后制作适配器,并在
getView()
方法中为固定值设置单元格宽度和高度(根据dp计算),之后,当您更改代码中的单元格数量时,网格视图将更改其宽度以适应单元格数量*每个单元格的宽度

//cellWidth = width of each cell including paddings
//gridRowsNumber = number of cells in width
//gridColsNumber = number of cells in height
// in activity's of fragment's onCreate();
gridView.getLayoutParams().width = cellWidth * gridRowsNumber;
gridView.getLayoutParams().height = cellWidth * gridColsNumber;
布局中

<GridView
    android:id="@+id/grid_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:background="@android:color/white"
    android:numColumns="5"
    android:scrollbars="none">
</GridView>

它应该是columnWidth x numOfColumns。-但是你认为列宽的值是多少呢?我在考虑每种宽度30-50dp。你不能直接在布局中这样做,你需要一个函数来计算这些值并手动设置它们。我会使用自定义视图组来保存GridView和ListView,并在自定义视图组内计算精确的值。太好了。效果很好。谢谢
<GridView
    android:id="@+id/grid_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:background="@android:color/white"
    android:numColumns="5"
    android:scrollbars="none">
</GridView>
public View getView (int position, View convertView, ViewGroup parent) 
{
    ...
    holder.cellView.getLayoutParams().height = cellWidth;
    holder.cellView.getLayoutParams().width = cellWidth;
    ...
}