10

我有一个带有关联 ArrayAdapter 的 ListView,它在多个活动中显示其内容。不幸的是,现在有必要在其中一个设置中的 ListView 不显示其所有元素,而只是显示“属性”未设置为 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" 但它没有改变任何东西......

谢谢!

4

6 回答 6

9

将列表视图的所有内容的可见性设置为消失,然后将视图的可见性设置为消失......这将隐藏行而不占用空间......即使我一直在搜索它也对我有用这个但是经过研究我发现了这个....

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

于 2013-06-22T18:35:29.753 回答
8

我和你有同样的问题

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

适配器.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;
    }

}

空白布局会是这样的,

空白布局.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>
于 2014-07-10T10:09:11.610 回答
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;
    }

如果你以不同的方式夸大你的观点,你可能需要稍微改变一下。我自己做过,效果很好。

于 2013-01-23T23:27:40.653 回答
3

您可以使用 android:layout_height="wrap_content" 的 getview 布局并使用 Visibility gone 来隐藏您的布局

于 2012-11-30T13:50:09.470 回答
1

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

我希望这可以帮助你。

问候

于 2012-11-30T13:43:08.253 回答
-2

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

于 2015-10-22T09:08:32.623 回答