2015-12-01 8 views
17

Mam układ, który wygląda tak:owinąć układ z TextView

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

użyłem FlowLayout aby wyświetlić listę TextView (może ona zawierać 10-15 TextView). Tak więc, w oparciu o dostępne puste miejsce na ekranie, chcę pokazać liczbę wyświetleń tekstu. Na przykład, jeśli jest 15 wyświetleń tekstu, a na dużym ekranie jest miejsce na 10 widoków tekstu, chcę pokazać 9 widoków tekstu i pokazać "+6" w ostatnim widoku tekstowym. Na małym ekranie może być dostępne tylko 5 odsłon, w tym 4 odsłonach z "+11" w ostatnim widoku tekstowym. Dla jasnego zrozumienia, oto zrzut ekranu. Jak widać, rzeczywista liczba wyświetlanych odsłon to 5., ale 2 są wyświetlane, a +3 jest dodane. Podobnie, w zależności od dostępnej przestrzeni ekranu, chcę dodać liczbę odsłon w układzie.

Jak można to osiągnąć programowo?

enter image description here

+0

Czy możesz sprawdzić, ile wyświetleń tekstu jest widocznych w Twoim FlowLayout? – Sree

+0

lub w inny sposób wstawisz w scrollview. więc nie musisz liczyć. – KDeogharkar

+0

Nie chcę przewijać układu przepływu. Jak widać na powyższym zrzucie ekranu, chcę wyświetlać jako liczbę wyświetleń tekstu tak jak na ekranie i na końcu wyświetlać "+ pozostałe". –

Odpowiedz

2

spróbuj dodać TextView w pętli, dodając każdą z nich osobno w nowym OnPreDrawListener. Po dodaniu każdego z nich sprawdź, czy nie przekracza on miejsca w rzędzie, a jeśli tak, usuń go i dodaj licznik. Jeśli nadal przekracza wiersz, usuń jeszcze jeden i zwiększ licznik.

Kluczem jest przetestowanie każdego w oddzielnym programie OnPreDrawListener, więc wszystko dzieje się przed wyświetleniem widoku, ale po jego obliczeniu i rozmiarze obliczono widok widoku.

9

Spróbuj programowo dodając TextView do linearLayout w pętli for, w którym po dodaniu każdego TextView, otrzymać pozostałą dostępną szerokość (można obliczyć za pomocą [ScreenWidth- (suma dodanych TextView szerokość + [No.of textviews * margines/dopełnienie dla każdego])] *)

Jeśli szerokość jest mniejsza niż pewne minimum (powiedz, że potrzebujesz minimum 100px dla każdego tekstu), przerwij pętlę i dodaj tekst wskaźnika zliczania.

mogę myśleć poniżej kod, to może nie być dokładny, ale po prostu pokazać, co Im myślenie

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

"Powiedz, że potrzebujesz co najmniej 100 pikseli dla każdego widoku tekstowego" ... Szerokość widoku tekstu nie jest stała. wszystkie teksty nie mają tej samej długości. Teksty pochodzą z usługi REST. Więc jeśli istnieją trzy teksty, które mają 2-3 znaki, a potem pojawia się czwarty, który ma 20 znaków? –

2

Gdybym musiał zaimplementować coś podobnego do tego, co opisałeś, spróbowałbym rozwikłać/podklasę FlowLayout i zaktualizować jej metody onMeasure i onLayout.

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

1) Pierwszym krokiem jest ograniczenie wysokości FlowLayout w onMeasure. Ponadto, może on być wystarczający, aby zrobić coś takiego:

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

2) Drugim krokiem jest zaktualizowanie onLayout, więc zatrzymuje dodając linie i widoki linii po osiągnięciu wysokości max, a następnie dodaj swój pogląd, który wyświetla liczbę ukryte widoki: