这是我的.xml 当我触摸单元格时 - 可见性设置为View.GONE,但它只是以View.INVISIBLE消失。细胞所在的地方有一个空的空间。细胞的大小是固定的。
如何配置GridLayout以正常工作?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridLayout
android:id="@+id/grid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#DDDDDD"
android:columnCount="3"
android:rowCount="3" >
<LinearLayout
android:id="@+id/lin1"
android:layout_width="170px"
android:layout_height="170px"
android:background="#0099cc"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/lin2"
android:layout_width="170px"
android:layout_height="170px"
android:background="#99CC00"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/lin3"
android:layout_width="170px"
android:layout_height="170px"
android:background="#FFBB33"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/lin4"
android:layout_width="170px"
android:layout_height="170px"
android:background="#ff4444"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/lin5"
android:layout_width="170px"
android:layout_height="170px"
android:background="#33b5e5"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/lin6"
android:layout_width="170px"
android:layout_height="170px"
android:background="#aa66cc"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/lin7"
android:layout_width="170px"
android:layout_height="170px"
android:background="#9933cc"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/lin8"
android:layout_width="170px"
android:layout_height="170px"
android:background="#669900"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:id="@+id/lin8"
android:layout_width="170px"
android:layout_height="170px"
android:background="#ff8800"
android:onClick="hideCell"
android:orientation="horizontal" >
</LinearLayout>
</GridLayout>
</LinearLayout>
这是hideCell方法的代码:
public void hideCell(View v) {
v.setVisibility(View.GONE);
}
答案 0 :(得分:2)
好的,根据GridLayout的Android文档:
对GONE的解释
出于布局目的,GridLayout将可见性状态为GONE的视图视为零宽度和高度。这与忽略标记为GONE的视图的政策略有不同。例如,如果在列中单独存在标记视图,则当且仅当视图上未定义重力时,该列本身将折叠为零宽度。如果定义了重力,则标记过去的视图对布局没有影响,并且应该布置容器,就好像从未添加过视图一样。这些语句同样适用于行和列,以及行或列组。
所以我通过创建自己的GridView类来解决这个问题。
答案 1 :(得分:-1)
示例:
package ua.vsgroup.widgets;
import android.content.Context;
import android.support.v7.widget.GridLayout;
import android.util.AttributeSet;
import android.view.View;
public class vsGridLayout extends GridLayout {
View[] mChild = null;
public vsGridLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public vsGridLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public vsGridLayout(Context context) {
this(context, null);
}
private void arrangeElements() {
mChild = new View[getChildCount()];
for (int i = 0; i < getChildCount(); i++) {
mChild[i] = getChildAt(i);
}
removeAllViews();
for (int i = 0; i < mChild.length; i++) {
if (mChild[i].getVisibility() != GONE)
addView(mChild[i]);
}
for (int i = 0; i < mChild.length; i++) {
if (mChild[i].getVisibility() == GONE)
addView(mChild[i]);
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
arrangeElements();
super.onLayout(changed, left, top, right, bottom);
}
}