Skocz do zawartości
Castic

Widget i coś w rodzaju listy

    Rekomendowane odpowiedzi

    Castic

    Witam.

    Stworzyłem aplikację, która wyświetla z bazy informacje do ListView. Wszystko chodzi pięknie, jak są 3 rekordy w bazie to wyświetla 3 na liście itp, wiadomo :)

    Chciałem teraz stworzyć widget, który wyświetlałby również te informacje z bazy danych. Niestety, SDK nie daje możliwości używania ListView w widgetach. Jak zatem, dynamicznie tworzyć (zależnie od ilości elementów w bazie) TextView? Bo nie widzę innego rozwiązania.

    Dziękuję.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Jak zatem, dynamicznie tworzyć (zależnie od ilości elementów w bazie) TextView? Bo nie widzę innego rozwiązania.

    np. tak:

    LinearLayout layout = (LinearLayout) findViewById(R.id.ID_DO_TWOJEGO_LAYOUTU);
    
    int size = liczba_text_views;
    for (int i = 0; i < size; i++) {
       TextView t1 = new TextView(context);
       t1.setText(Twój tekst)
       layout.addView( t1 );
    }
    

    Oczywiście jest to na szybkiego, ale główna idea pozostaje, bo należy to dodatkowo formatować, aby było ładniej i dobrze byłoby robić to asynchronicznie - zwłaszcza, jeśli jest to spora baza danych

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    omijając nie nie wygodę takiego rozwiązania, jest to dość głupie rozwiązanie więc zamiast programowo generować setki TextView skorzystaj z ListView

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    gzajac
    omijając nie nie wygodę takiego rozwiązania, jest to dość głupie rozwiązanie więc zamiast programowo generować setki TextView skorzystaj z ListView

    Biorąc pod uwagę że kolega chce to wyświetlić w App Widget (które nie pozwala na stosowanie ListView) to jest to jedyne sensowne rozwiązanie.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    no rzeczywiście gdzieś mi to umknęło, ale zawsze znajdzie jakiś doby człowiek czujny jak bolszewik

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Castic

    Baza jest niewielka, w widgecie będzie wyświetlone 5-7 pozycji.

    A jest taka możliwość, by stworzyć sobie layout, tak jak przy listView, layout zawierający kilka TextView i taki layout dynamicznie umieszczać na widgecie (jego kopie)? Powiedzmy, że w bazie jest Imię i Nazwisko, chciałbym w widgecie wypisać x rekordów - Imie i obok Nazwisko i pod spodem następne. Jest taka możliwość?

    ---------- Post dołączono o 22:28 ---------- Poprzedni post napisano o 15:46 ----------

    Ok, więc pokombinowałem trochę: utworzyłem plik XML layout, w którym umieściłem textView, button itp (na razie eksperymentuje ze zwykłym activity, nie z widgetem). Potem, taki layout dynamicznie dołączam do głownego layoutu:

            
           LinearLayout l = (LinearLayout) findViewById(R.id.lay);
           LayoutInflater layInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           l.removeAllViewsInLayout();
           int i;
           for(i=0;i<3;i++){
           View labelView = layInflater.inflate(R.layout.layoutDrugi, null);
           	l.addView(labelView);
           }

    Jest ok, tworzą się 3 kopie (czyli 3 razy textView + button) itp. Mam tylko teraz jedno pytanie, jak, w środku tej pętli jeśli dobrze kombinuję, dostać się do tego TextView i Buttona - ale każdego z osobna, tzn przy pierwszym przejściu pętli do pierwszego, przy 2 do drugiego itd. findViewById wiadomo, widzi tylko element TextView i Button z layoutDrugi, ale jak dostać się do tych dynamicznie dołączanych i pozmieniać im tekst?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    metoda addView dodaje te komponenty do Layoutu l,

    można się do nich wciąż odwoływać, bo nie są one nigdzie gubione :)

    przykładowo:

    int size = l.getChildrenCounter(); // nie pamiętam, czy na bank tak to brzmi
    for (int i = 0; i < size; i++) {
       View view = (View) l.getChildAt(i);
       if (view instanceOf TextView) {
           TextView tv = (TextView) view;
           tv.setText( text );
       }
    }
    

    // nie bijcie za literówki, pisane z rana, na kacu i z głowy :P

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Castic

    Ok uporałem się z problemem, poniżej rozwiązanie dla potomnych (piwa rozdane):

     LinearLayout l = (LinearLayout) findViewById(R.id.lay);
           LayoutInflater layInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           l.removeAllViewsInLayout();
           int i;
           for(i=0;i<3;i++){
           View layoutDrugi = layInflater.inflate(R.layout.second_lay, null);
           	l.addView(layoutDrugi);
           }
    
           int k;
           int size2;
           int size = l.getChildCount(); 
           for (i = 0; i < size; i++) {
               LinearLayout view = (LinearLayout) l.getChildAt(i);
               if (view instanceof LinearLayout) {
                	size2 = view.getChildCount(); 
               	for(k=0;k<size2;k++){
               		TextView tv = (TextView)view.getChildAt(k);
                       if (tv instanceof TextView) {
                       	tv.setText("cos "+i+" "+k);
                       }
               	}
               }
           }

    Wszystko pieknie, każdy textView zmienia tekst :)

    I byłoby cudownie, poradziłbym sobie, gdyby nie fakt, że klasa widgetu rozszerza AppWidgetProvider, który nie dostarcza metody findViewById...... :facepalm3:

    Jak w widgecie zrobić to co zrobiłem powyżej dla Activity? Już się załamuję, do tej pory pisanie było przyjemne, przejrzyste, skończyłem swoją aplikację, chciałem dodać widget bardzo przydatny, a tu takie problemy :(

    Chcę w widgecie wyświetlić kilka (zależnie od ilości w bazie) elementów (element pod elementem), gdzie taki pojedynczy element składa się z np. 2 textView obok siebie i ustawić im text wartościami z bazy.

    Wie ktoś jak coś takiego zrobić? Dziękuję.

    Edytowane przez Castic

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    tzn problem z findViewById w Widgetcie już nieaktualny? :)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Castic

    Nie nie, nie aktualny był poprzedni post, po dodaniu rozwiązania i nowego problemu uznałem, że tamta część tylko zaśmieca forum :) Fakt, nie najlepiej to ująłem dlatego poprawione.

    Proszę o pomoc, kombinowałem, ale teraz stoję w miejscu od paru dni i nie mogę wpaść na jakieś rozwiązanie ;/

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x