当可见性设置为消失时,如何重新排列 gridview 子级?

问题描述 投票:0回答:4

我通过将子级的可见性设置为

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>
android gridview
4个回答
2
投票

要从 GridView 中删除单个项目,您必须将其从适配器或 GridView 的数据源中删除。正如您所发现的,因为更改单元格的可见性不会重新排列您的布局,它只会显示该项目的空白单元格。


0
投票

我自己也在为这个问题而苦苦挣扎。奇怪的是,文档呈现了这个确切的场景,但经过实验,它不起作用:

https://developer.android.com/reference/android/widget/GridLayout.html

它指出:

“出于布局目的,GridLayout 将可见性状态为 GONE 的视图视为具有零宽度和高度。这与忽略完全标记为 GONE 的视图的策略略有不同。例如,如果一个已标记为 GONE 的视图单独位于一列中,当且仅当视图上没有定义重力时,该列本身会折叠到零宽度。如果定义了重力,则消失标记的视图对布局没有影响,并且应该布局容器就好像视图从未添加到其中一样。在多余空间分配期间,GONE 视图的权重为零。 这些语句同样适用于行和列,以及行组或列组。”

有人找到更好的解决方案了吗?


0
投票

您可以在更改视图的可见性后调用此方法:

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);
        }
    }
}

-1
投票

GONE 应该完全删除它,根据文档和我的经验,它不再占用任何空间。那么,如果是,那么可能是由于 GridView 上方和下方元素的填充或边距所致?

© www.soinside.com 2019 - 2024. All rights reserved.