2015-12-01 24 views
17

Ho un layout che assomiglia a questo:avvolgere un layout con textviews

<RelativeLayout> 
<!--aligned parent top--> 
</<RelativeLayout> 
<FlowLayout> 
<!--Should fill remaining space--> 
</FlowLayout> 
<RelativeLayout> 
<!--aligned parent bottom--> 
</<RelativeLayout> 

ho usato FlowLayout per visualizzare un elenco di textviews (Può contenere 10-15 textviews). Quindi, in base allo spazio vuoto disponibile sullo schermo, voglio mostrare il numero di visualizzazioni testuali. Ad esempio, se ci sono 15 visualizzazioni di testo da mostrare lì e c'è spazio per 10 visualizzazioni di testo su uno schermo grande, voglio mostrare 9 visualizzazioni di testo e mostrare "+6" nell'ultima visualizzazione di testo. In uno schermo di piccole dimensioni lo spazio potrebbe essere disponibile solo per 5 visualizzazioni di testo, nel senso che voglio mostrare 4 visualizzazioni di testo con "+11" nell'ultima visualizzazione di testo. Per una comprensione chiara, ecco lo screenshot. Come puoi vedere, il numero effettivo di visualizzazioni testuali da visualizzare è 5. ma vengono visualizzati 2 e viene aggiunto +3. Allo stesso modo, in base allo spazio disponibile sullo schermo, voglio aggiungere il numero di visualizzazioni del testo nel layout.

Come può essere raggiunto a livello di programmazione?

enter image description here

+0

è possibile ottenere quante visualizzazioni di testo sono visibili nel FlowLayout? – Sree

+0

o altrimenti inserirai in scrollview. quindi non devi contare. – KDeogharkar

+0

Non voglio scorrere il layout del flusso. Come puoi vedere nello screenshot qui sopra, voglio visualizzare il numero di visualizzazioni del testo come lo schermo può e mostrare "+ rimanenti" alla fine. –

risposta

2

Provate ad aggiungere la textviews in un ciclo, l'aggiunta di ciascuno separatamente in una nuova OnPreDrawListener. Dopo aver aggiunto ciascuno, controlla se supera lo spazio sulla riga e, in tal caso, rimuovilo e aggiungi il contatore. Se supera ancora la riga, rimuovine un'altra e aumenta il contatore.

La chiave è di testarli in un OnPreDrawListener separato, quindi tutto accade prima che venga visualizzata la vista, ma dopo la la vista ha avuto il suo layout e le dimensioni calcolate.

9

Prova a livello di codice aggiungere TextViews ad un LinearLayout in un ciclo in cui dopo l'aggiunta di ogni textView, ottenere larghezza disponibile rimanente (può essere calcolato con [ScreenWidth- (somma di textviews aggiunto larghezza + [Numero visioni di testo * margine/riempimento per ciascuna])] *)

Se la larghezza è inferiore ad un minimo (ad esempio, è necessario un minimo di 100 pixel per ogni vista testo), interrompere il ciclo e aggiungere il testo dell'indicatore del conteggio.

mi viene in mente al di sotto del codice, potrebbe non essere preciso, ma solo per mostrarvi che cosa Im pensare

int screenWidth = getScreenWidth(); 
    int currentWidth=0; 
    int minimumWidthForAChildWithOffset = 100;//offset should include width of indicator 
    int childCount = 10; 
    int paddingForEachChild = 15; 
    for (int i = 0; i <childCount; i++) { 
     TextView label= getChildView(); 
     parent.addView(label, i); 
     currentWidth += parent.getChildAt(i).getWidth() + paddingForEachChild; 
     if(i!=childCount-1/*ignore if this is the last item*/ && screenWidth-currentWidth<=minimumWidthForAChildWithOffset){ 
      //add indicator label to layout here 
      break; 
     } 
    } 
+0

"Supponiamo che sia necessario un minimo di 100 pixel per ogni vista testo" ... La larghezza della vista del testo non è fissa. tutti i testi non hanno la stessa lunghezza. I testi provengono da un servizio REST. Quindi se ci sono tre testi lunghi 2-3 caratteri e poi arriva il 4 che è lungo 20 caratteri? –

2

Se dovessi implementare qualcosa come hai descritto, proverei a inserire/sottoclasse FlowLayout e ad aggiornare i suoi metodi onMeasure e onLayout.

Ecco il FlowLayout: https://github.com/blazsolar/FlowLayout/blob/develop/FlowLayout/src/main/java/com/wefika/flowlayout/FlowLayout.java

1) Il primo passo è quello di limitare l'altezza di FlowLayout in onMeasure. Inoltre, potrebbe essere sufficiente per fare qualcosa di simile:

<LinearLayout android:orientation="vertical" ... > 
    <RelativeLayout ... />  
    <FlowLayout android:layout_height="0dp" android:layout_weight="1" ... />   
    <RelativeLayout ... /> 
</LinearLayout> 

2) Secondo passo è quello di aggiornare onLayout, così si ferma l'aggiunta di linee e punti di vista di linea quando si raggiunge l'altezza massima, quindi aggiungere la tua vista che mostra il numero di viste nascoste

Problemi correlati