2012-11-30 12 views
9

Ho una ListView con un ArrayAdapter associato che visualizza i suoi contenuti in diverse attività. Purtroppo è diventato necessario ora che il mio ListView in una delle impostazioni non mostra tutti i suoi elementi, ma solo quelli in cui "proprietà" non è impostata su true. Vorrei evitare di utilizzare due ArrayAdapter con contenuti diversi, poiché in seguito ho dovuto in qualche modo mantenerli sincronizzati. Ho cercato in questo modo (questo metodo ora solo presuppone che GetView viene chiamato nel ambiente dove vogliamo nascondere alcuni elementi):Nascondi riga da ListView senza occupare spazio

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; 
} 

questo funziona, però ho ottenere una riga bianca se l'elemento ha isProperty == vero. Mi piacerebbe rendere la riga invisibile nel senso, che non occupi più spazio. È possibile?

Il file XML utilizzato per convertView assomiglia a questo:

<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> 

ho cercato di riprodurre tutti i Android: layout_height = "wrap_content" con "fill_parent", ma non ha cambiato nulla ...

Grazie!

+0

io non capisco, il la proprietà booleana è la stessa per tutti gli elementi in quanto è un attributo all'adattatore. Come poteva sapere quale riga nascondere? –

+0

scusate, isProperty() ovviamente è un metodo di elementi nell'array – user1809923

+0

se avete ancora problemi si prega di controllare la mia risposta funzionerà sicuramente. –

risposta

3

È possibile utilizzare il layout GetView di Android: layout_height = "wrap_content" e fare uso visibilità andato a nascondere il layout

+0

Scusa, non capisco quello che stai dicendo. Potresti chiarire la tua soluzione? – user1809923

3

Allora, cosa ha significato Romain era di aggiungere un id al vostro LinearLayout

<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"> 

Poi, nel tuo Java si farebbe

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; 
    } 

Potrebbe essere necessario cambiarlo leggermente se si gonfiano le visualizzazioni in modo diverso. L'ho fatto da solo e funziona davvero bene.

+1

Anche se ho usato 'View.GONE' avevo un sacco di spazio vuoto alla fine della listview che l'utente poteva scorrere. Per risolvere il problema, ho aggiornato 'getCount()' per escludere le righe nascoste dal conteggio totale. Un'implementazione molto più pulita sarebbe stata quella di mantenere due array: uno per i dati originali e un altro per l'adattatore che esclude i dati delle righe nascoste. –

+0

L'ho già fatto in precedenza e quello che non mi piace è che i tuoi dati extra sono quindi tuoi. – MinceMan

+0

sì, sono d'accordo - ecco perché non ho seguito questa strada per questa particolare istanza :-) Ho dimenticato di menzionare nel mio commento sopra: una volta 'getCount()' restituisce un valore che esclude le righe di dati che vuoi nascondere, tu dovrebbe individuare le righe di dati nascoste alla fine della matrice utilizzata dall'adattatore. –

7

Imposta la Visibilità di tutti i contenuti della visualizzazione elenco su GONE e quindi imposta la visibilità della Vista su Andata .... questo nasconderà la riga senza occupare spazio ..... ha funzionato per me anche io sono alla ricerca di questo, ma dopo una ricerca ho trovato questo ....

EDIT 1: Impostazione della visibilità della vista per GONE è sufficiente. Non è necessario impostare la visibilità dell'elemento figlio.

4

Sto avendo lo stesso problema come hai

ho capito da 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; 
    } 

} 

E layout vuoto sarà così,

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> 
Problemi correlati