Android setVisibility(GONE)视图变为不可见,但仍占用空间

Android setVisibility(GONE)视图变为不可见,但仍占用空间,android,android-listview,android-view,Android,Android Listview,Android View,我有一个视图,它实际上是一个按钮。这是它的XML布局(add_new.XML) 它消失了,但仍然占据着空间。像这样: 此按钮是列表视图中的标题,由以下xml定义: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" and

我有一个视图,它实际上是一个按钮。这是它的XML布局(add_new.XML)

它消失了,但仍然占据着空间。像这样:

此按钮是
列表视图
中的标题,由以下xml定义:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/porno" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="30dp"
        android:layout_height="40dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="4dp"
        android:src="@drawable/ic_launcher">
    </ImageView>

    <TextView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/label"
        android:textSize="20dp" >
    </TextView>

</LinearLayout> 

你可以做的是设置一个if语句,每当条件设置可见性为“GONE”时,将视图设置为包裹内容,你的空间将是自由的,我这样做了,它为seekbar工作了如果仍然需要,有一个很好的方法来处理它:

parentView.removeView(childView);
这里有一个例子:

final WhatEverLayout parentView, childView;
parentView = (WhatEverLayout)findViewById(R.id.parentView_xml);
childView =(WhatEverLayout)findViewById(R.id.childView_xml);
parentView.removeView(childView);

在我看来,这是一个Android错误,我们只是通过以下方式解决此问题:

<FrameLayout android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout android:id="@+id/layout_to_hide"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content">
         //Put here your views
    </LinearLayout>
</FrameLayout>

//把你的观点放在这里

只需隐藏带有id布局的LinearLayout\u即可隐藏
可见的。消失了
,然后根FrameLayout将折叠其高度,为您提供一个带有非空格标题的“隐藏”。

我不认为这是一个错误。。只需使用GONE就可以让空白消失。
CSS也做同样的事情。尝试
display:block
vs
visibility:hidden
这是我的解决方案。创建一个名为“special.xml”的新布局文件,将代码复制到该文件中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
    android:visibility="gone">

</LinearLayout>
header_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:id="@+id/mHeaderView"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/mNoHelpLayout"
                android:layout_width="match_parent"
                android:layout_height="176dip"
                android:background="#ffffffff"
                android:gravity="center"
             />
       </LinearLayout>
   </LinearLayout>
使用mHeaderView.setVisiable()控制可访问而不是outerView.setVisiable()。
这对我很有用。

此线程中的所有回复都建议使用新的包装器视图,这是有代价的。完全隐藏视图的正确方法是将页边距设置为0,同时将“可见性”设置为“消失”。在这个代码示例中,cardView是我试图隐藏的视图。cardView的直接父级是RecyclerView,这就是我们使用RecyclerView.LayoutParams的原因-记住用正确的布局参数替换

if (cardView.getVisibility() != GONE) {
    cardView.setVisibility(GONE);
    RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) cardView.getLayoutParams();
    layoutParams.setMargins(0, 0, 0, 0);
    cardView.setLayoutParams(layoutParams);
}

通过执行此操作,将
layout\u width
layout\u height
设置为
0
要隐藏项目的位置

//if item's parent layout is LinearLayout, change according to your item xml
holder.itemView.setLayoutParams(new LinearLayout.LayoutParams(0,0));
您可以使用:
viewToHide?.postDelayed({viewToHide?.visibility=View.GONE},持续时间百万)

一个通用且简单的解决方案是避免所有这些繁琐的代码:

您需要在要隐藏的视图集上添加一个容器布局或父布局。它可以是任何像CardView或FrameLayout之类的东西


只是它必须是要隐藏的视图的父视图。你不会得到所有的空白。因为它会考虑整个容器来隐藏,而不是考虑个人视图来隐藏,避免了空白。

在使用<代码> TrimestMeals.BeaGuelelayEdvestor()/代码>时,遇到了类似的问题,在<代码>布局检查器工具< /代码>中,我看到视图是“代码>已消失”,但它仍然占用空间,我认为这是Android中的一个bug,一个解决方法是使用
视图执行可见性块。post(可运行操作)

对我来说,如果我在下一个运行循环中显示/隐藏,它就起作用了

parentView.post { 
   childViewToHide.visibility = View.GONE
}

将视图填充和边距设置为0,然后将“视图可见性”设置为gone解决了我的问题。

最简单的方法是在子视图可见性更改后强制父视图重新测量其自身的高度。
试着这样做:

parentView.setLayoutParams(new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT));

在这种情况下,父视图是一个线性布局

为什么要放大视图,只需点击按钮。因为我随后将此视图设置为ListView标题,请在添加了add_new.xml的位置发布您的xml,这是有限的信息!不要将此添加为列表的标题。只需将它放在您获取列表的XML中的列表上方。我想查看您获取列表的XML。请提供一些示例。让我们以我的示例为例。我必须显示一个搜索栏,如果该项目是一个音频文件,如果不是,那么没有seekbar。因此,我将xml中的seekbar设置为wrap内容(高度和宽度),这意味着布局将占用显示元素的空间。当seekbar“消失”时,空间将不被使用,因为视图会包装不存在的内容。如果可以的话,我会展示一个屏幕截图,但是技巧很简单。你还没有找到更好的解决办法吗?这真的是虫子吗?我遇到了同样的问题所有
addView
removeView
方法在
AdapterView
中抛出
UnsupportedOperationException
。这对我很有效。谢谢OP实际上想让空白空间消失,但“消失”似乎不起作用。display不是android attributeWell。。。我只是以“display”为例,而v.setVisibility(View.GONE)在我的例子中起了作用——同样的效果也消失了。这与
ListView
@Miha\u x64无关。你能解释一下原因吗?ListView的行为应与任何其他视图相同。问题的作者已经尝试了
消失了
,然后创建了此问题。另一个答案是
GONE
ListView
中无法正常工作:我的答案清楚地说明了所需的额外步骤,因为GONE是不够的。你的评论忽略了我答案的主要部分以及与你的链接答案相关的缺点。问题中没有明确指定边距。这意味着它们是
(0,0,0,0)
if(true){
  view=mInflater.inflate ( R.layout.special,parent, false );
}else{
  view=mInflater.inflate(R.layout.normal,parent,false);
  // The view that you want to be visible
}
if (cardView.getVisibility() != GONE) {
    cardView.setVisibility(GONE);
    RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) cardView.getLayoutParams();
    layoutParams.setMargins(0, 0, 0, 0);
    cardView.setLayoutParams(layoutParams);
}
//if item's parent layout is LinearLayout, change according to your item xml
holder.itemView.setLayoutParams(new LinearLayout.LayoutParams(0,0));
If you want to show itemView 

if (ItemBean.isShow()) 
{
   holder.itemView.setVisibility(View.VISIBLE);
   holder.itemView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
 } else
 {
     holder.itemView.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
     holder.itemView.setVisibility(View.GONE);
 }
parentView.post { 
   childViewToHide.visibility = View.GONE
}
parentView.setLayoutParams(new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT));