从ListView隐藏行而不占用空间

时间:2012-11-30 13:23:36

标签: android android-listview

我有一个带有关联ArrayAdapter的ListView,它在几个活动中显示其内容。不幸的是现在有必要,我的ListView在其中一个设置中不会显示其所有元素,而只是“property”未设置为true的那些元素。我想避免使用两个具有不同内容的ArrayAdapter,因为那时我不知何故需要让它们保持同步。我试过这样的(这个方法现在假设在我们想要隐藏某些元素的设置中调用getView):

public View getView(int position, View convertView, Context context) {
....

    if(!arrayitems[position].isProperty()) { //arrayitems is the underlying array
        convertView.setVisibility(View.VISIBLE); 
    } 
    else {
        convertView.setVisibility(View.GONE); 
    }
    return convertView;
}

这很有效,但是如果元素的isProperty == true,我会得到一个白色的行。我想在这个意义上让这行不可见,它不再占用任何空间。这可能吗?

convertView使用的xml文件如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/text_item_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="4dp"
            android:maxLines="1"
            android:ellipsize="none"
            android:textSize="12sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/text_item_status"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            android:textStyle="bold" />

    </LinearLayout>

     <TextView android:id="@+id/text_item_text"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:textSize="12sp"
         android:maxLines="3"
         android:ellipsize="none" />

     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginTop="2dp"
         android:orientation="horizontal" >

         <TextView
             android:id="@+id/text_item_rating"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginRight="4dp"
             android:textSize="10sp" />

         <TextView
             android:id="@+id/text_item_voted"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textSize="10sp" />

     </LinearLayout>

</LinearLayout>

我尝试用“fill_parent”重播所有android:layout_height =“wrap_content”,但它没有改变任何东西......

谢谢!

6 个答案:

答案 0 :(得分:9)

将列表视图的所有内容的可见性设置为GONE,然后设置View to Gone的可见性....这将隐藏行而不占用空间.....它对我有效甚至我有一直在寻找这个,但经过一项研究后我发现了这个....

编辑1: 将View的可见性设置为GONE就足够了。无需设置子元素的可见性。

答案 1 :(得分:5)

我遇到了和你一样的问题

我已经通过inflating another layout layout with no height and width

找到了它

Adapter.java

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (YOUR_CONDITION) {
            return inflater.inflate(R.layout.blank_layout, parent,
                    false);
    } else {
            View vi = inflater.inflate(R.layout.list_item, parent, false);
            return vi;
    }

}

空白布局就像这样,

blank_layout.xml

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


</LinearLayout>

答案 2 :(得分:4)

所以Romain的意思是为你的LinearLayout添加一个id

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:orientation="vertical"
    android:id="@+id/linear_layout">

然后在你的Java中你会做

    public View getView(int position, View convertView, Context context) {
    ....
    holder.lLayout = (LinearLayout) convertView.findViewById(R.id.linear_layout);
    ....
    if(!arrayitems[position].isProperty()) { //arrayitems is the underlying array
        holder.lLayout.setVisibility(View.VISIBLE); 
    } 
    else {
        holder.lLayout.setVisibility(View.GONE); 
    }
    return convertView;
    }

如果以不同方式夸大您的观点,您可能需要稍微更改一下。我自己做了这件事,效果很好。

答案 3 :(得分:3)

你可以使用android的getview布局:layout_height =“wrap_content”并使用Visibility去隐藏你的布局

答案 4 :(得分:1)

另一位用户遇到了同样的问题,他用这种方式解决了这个问题:https://stackoverflow.com/a/7928923/1548679

我希望这可以帮到你。

迎接

答案 5 :(得分:-2)

通过使用您的逻辑修改getCount()以及getView()中的位置,您可以使其适用于样本Check http://www.sherif.mobi/2012/01/listview-with-ability-to-hide-rows.html @ sherif-elkhatib