Android:在ListAdapter中设置TextView的可见性

时间:2013-01-27 22:58:21

标签: android android-listview

我的布局包含两个ListView(见下图),它们都是使用两个SimpleAdapter创建的;让我们在QLocations ListView和AllLocations ListView底部的ListView上调用ListView。

我想隐藏AllLocations ListView中的所有红色TextView元素。我无法弄清楚如何仅从AllLocations列表视图中隔离TextViews,而不是从QLocations ListView中隔离。

所以,我的问题是,如何隐藏特定ListView中的所有TextView元素?

enter image description here

这是我的代码:

创建ListViews

    // Getting qListView: List View for locations with Qs
    qLV = (ListView) activity.findViewById(R.id.qListView);

    // list adapter
    ListAdapter qAdapter = new SimpleAdapter(activity, qListItems,
            R.layout.google_places_item,
            new String[] { KEY_REFERENCE, KEY_NAME}, new int[] {
                    R.id.reference, R.id.name });

    // Adding data into listview
    qLV.setAdapter(qAdapter);

    // Getting allListView: List View for locations without Qs
    allLV = (ListView) activity.findViewById(R.id.allListView);

    // list adapter
    ListAdapter allAdapter = new SimpleAdapter(activity, placesListItems,
            R.layout.google_places_item,
            new String[] { KEY_REFERENCE, KEY_NAME}, new int[] {
                    R.id.reference, R.id.name });

    // Adding data into listview
    allLV.setAdapter(allAdapter);

google_places_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView android:id="@+id/reference"
        android:visibility="gone"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

    <!-- Row for each location -->
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/qLocationRow"
        android:orientation="horizontal"
        >

    <!-- Q Name -->
    <TextView android:id="@+id/name"
        style="@style/qName"
    />

    <!-- Q WaitTime -->
    <TextView android:id="@+id/qName.qWaitTime"
        style="@style/qName.qWaitTime"
        android:text="14"
        />

    </LinearLayout>
</LinearLayout>

活动布局

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     style="@style/fullWidth"> 

    <!--  Label for List View of QLocations -->

    <TextView
        android:id="@+id/qListLabel"
        style="@style/widthMargins.Label"
        android:text="@string/qListLabel" />

    <!-- Horizontal Rule -->

    <View
        android:id="@+id/horizontalRule1"
        style="@style/widthMargins.horizontalRule"
        android:layout_below="@+id/qListLabel"
         />

    <!-- Linear Layout containing progress bar + text description -->
    <LinearLayout
        android:layout_width="200dp"
        android:layout_height="60dp"
        android:id="@+id/lin_progressBar"
        android:visibility="visible"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/horizontalRule1"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">

        <ProgressBar
            android:id="@+id/loadPlacesProgress"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <TextView 
            android:id="@+id/loadPlacesText"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="5dp"
            android:text="Loading..."       
            android:gravity="center_vertical"
            android:textSize="15sp"    
            />

        </LinearLayout>

    <!-- ListView for Q Locations -->    
        <ListView
            android:id="@+id/qListView"
            style="@style/widthMargins"
            android:layout_height="140dp"
            android:layout_below="@+id/horizontalRule1" />


    <!--  Label for List View of All Locations -->

    <TextView
        android:id="@+id/allListLabel"
        style="@style/widthMargins.Label"
        android:layout_below="@+id/qListView"
        android:text="@string/allListLabel" />

    <!-- Horizontal Rule -->

    <View
        android:id="@+id/horizontalRule2"
        style="@style/widthMargins.horizontalRule"
        android:layout_below="@+id/allListLabel"
         />

        <!-- Linear Layout containing progress bar + text description -->
        <LinearLayout
            android:layout_width="200dp"
            android:layout_height="60dp"
            android:id="@+id/lin_progressBar2"
            android:visibility="visible"
            android:layout_centerHorizontal="true"
            android:layout_below="@id/horizontalRule2"
            android:layout_marginTop="10dp"
            android:orientation="horizontal">

        <ProgressBar
            android:id="@+id/loadPlacesProgress2"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <TextView 
            android:id="@+id/loadPlacesText2"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="5dp"
            android:text="Loading..."       
            android:gravity="center_vertical"
            android:textSize="15sp"    
            />

        </LinearLayout>

    <!-- ListView for All Locations -->    

        <ListView
            android:id="@+id/allListView"
            style="@style/widthMargins"
            android:layout_height="140dp"
            android:layout_below="@+id/horizontalRule2"
            />

    <!-- Show on Map button -->
    <Button android:id="@+id/btn_show_map"
        style="@style/fullWidth"
        android:layout_centerHorizontal="true"
        android:text="Map"
        android:padding="20dp"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="10dip"/>

</RelativeLayout>

2 个答案:

答案 0 :(得分:2)

因此,在设置适配器后,您应该能够运行下面的代码以提供所需的效果。我不确定它的效率如何,但它至少应该完成工作。

    int numChildren = allLV.getListView().getChildCount();
    for(int i = 0; i < numChildren; i++)
    {
        LinearLayout ll = (LinearLayout) allLV.getListView().getChildAt(i);
        TextView tv = (TextView) ll.findViewById(R.id.qName.qWaitTime);
        tv.setVisibility(View.INVISIBLE);
    }

然后,当您想要显示红色框的文本时,请使用类似的方法将它们再次设置为可见。

答案 1 :(得分:1)

首先要知道列表视图项和数据之间没有1对1的映射。如果您有很多项目,那么当您浏览列表时,视图会被重复使用。

首先,您要更新适配器中的所有项目以获得正确的值。一旦更新了数据。然后通知适配器其数据已更改,它将自行重建adapter.notifyDataSetChanged()。通过适当缓存数据来快速重建列表。

您可以阅读MVC(模型 - 视图 - 控制器)以更好地了解这里发生的事情。