我通过将子级的可见性设置为
View.GONE
来隐藏网格视图中的子级。问题是,即使我将它设置为“消失”,它也会变得不可见,但仍然在它所在的位置留下一个间隙。
是否可以重新排列gridview,使隐藏元素不占用布局中的任何空间?
<GridView
android:id="@+activity_queues/gv_queue1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="200dp"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:padding="10dp"
android:stretchMode="none"
android:verticalSpacing="10dp" >
</GridView>
要从 GridView 中删除单个项目,您必须将其从适配器或 GridView 的数据源中删除。正如您所发现的,因为更改单元格的可见性不会重新排列您的布局,它只会显示该项目的空白单元格。
我自己也在为这个问题而苦苦挣扎。奇怪的是,文档呈现了这个确切的场景,但经过实验,它不起作用:
https://developer.android.com/reference/android/widget/GridLayout.html
它指出:
“出于布局目的,GridLayout 将可见性状态为 GONE 的视图视为具有零宽度和高度。这与忽略完全标记为 GONE 的视图的策略略有不同。例如,如果一个已标记为 GONE 的视图单独位于一列中,当且仅当视图上没有定义重力时,该列本身会折叠到零宽度。如果定义了重力,则消失标记的视图对布局没有影响,并且应该布局容器就好像视图从未添加到其中一样。在多余空间分配期间,GONE 视图的权重为零。 这些语句同样适用于行和列,以及行组或列组。”
有人找到更好的解决方案了吗?
您可以在更改视图的可见性后调用此方法:
private void rearrangeVisibleViewsInGridLayout() {
int childCount=binding.gridLayout.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = binding.gridLayout.getChildAt(i);
if(child==null) continue;
if(child.getVisibility()==View.GONE){
binding.gridLayout.removeViewAt(i);
}
}
}
GONE 应该完全删除它,根据文档和我的经验,它不再占用任何空间。那么,如果是,那么可能是由于 GridView 上方和下方元素的填充或边距所致?