Adapter ListView z dowolną liczbą typów wierszy (nie znasz liczby różnych typów wierszy)

Robię więc tę aplikację. Aplikacja analizuje stronę internetową, a dokładniej tablicę vbulletin. Kiedy analizuję wątek na forum, podzieliłem go tak, że kiedy analizuję każdy post w tym wątku, otrzymuję rzeczywistą treść postu w takich sekcjach, jak ta, i przechowuję sekcje we właściwej kolejności w tablicy:

[Plain text]
[Quote from somebody]
[Plain text]
[Another quote]
[Another quote again]
[Some more plain text]

Jednak post może być ułożony w dowolnej kolejności, jaką możesz znać, i może składać się z większej liczby lub mniejszej liczby sekcji niż w przykładzie, a także nie musi zawierać cytatów, lub może to być tylko jeden lub kilka cytatów . Wszystko jest możliwe.

Kiedy wymieniam posty w mojej aplikacji, używam ListView. Każdy wiersz tego listview będzie wtedyzawsze składa się z nagłówka i dowolnej kombinacji wcześniej wymienionych sekcji.

Sposób, w jaki myślałem o zrobieniu tego po przeczytaniu go trochę, to mieć jeden „układ podstawowy” z tylko znacznikiem układu w jednym pliku XML i osobnym układem dla każdej sekcji, przechowywanym w oddzielnych plikach XML, i przy każdym wywołaniu getView () w moim adapterze spójrz na post w tej pozycji na mojej „liście postów”, a następnie przejrzyj sekcje w tym konkretnym poście i nadaj nowy „układ cytatów” dla każdego cytatu -sekcja przechowywana w poście i nadaj „zwykły układ tekstu” dla każdej sekcji zwykłego tekstu w poście. I dla każdego z nich wypełniam całą zawartość należącą do tego posta.

Myślę, że to zadziała, ale może być problem z wydajnością? Jak rozumiem, inflacja układu jest dość droga, a ja nie będę mógł ponownie przetwarzać widoku przekazanego do getView (), ponieważ może to mieć kilka sekcji dodanych do niego, których nie potrzebuję w innym wywołaniu do getView () .. To znaczy, jeśli rozumiem getView () i trochę recyklingu.

Jest to podstawowy przykład tego, co rozumiem przez metodę getView () adaptera:

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    // Inflate the base-layout, which the others are added to.
    view = mInflater.inflate(R.layout.forum_post,null);

    View header = mInflater.inflate(R.layout.post_header_layout, null);
    View message = mInflater.inflate(R.layout.post_text_layout, null);
    View quote = mInflater.inflate(R.layout.post_quote_layout, null);

    ((ViewGroup)view).addView(header);
    ((ViewGroup)view).addView(message);
    ((ViewGroup)view).addView(quote);
    return view;
}

Następnie, w miarę potrzeby, wyodrębniam więcej cytatów / widoków wiadomości, gdy wyodrębnię dane z listy zapisanych postów.

Układ podstawowy jest tylko tagiem LinearLayout

Nadesłane przeze mnie układy to tylko relatywne układy z niektórymi TextViewami i dodanym ImageView.

Ten kod daje ten wynik, gdzie mamnagłówek z nazwą użytkownika, obrazem itp., jedną sekcjąZwykły tekst, i jedenCytat-sekcja. Wydaje się jednak, że nie działa to prawidłowo przez cały czas, ponieważ kiedy próbowałem go wypróbować, kopia listy utknęła w tle, a inna przewinęła się nad nią.

http://s14.postimg.org/rizid8q69/view.png

Czy jest lepszy sposób, aby to zrobić? Ponieważ wyobrażam sobie, że to nie jest bardzo wydajne

questionAnswers(3)

yourAnswerToTheQuestion