Dodawanie kontrolek przy pobraniu danych z bazy

0

Witam ! Mam pytanie. Jak zrobić żeby pobrać wyniki z bazy danych i aby aplikacja sama dodała elementy interfejsu aby to wyświetlić ?
Chodzi o to że np. jak są sklepy internetowe to żeby program pobrał z bazy np. 20 wyników i do interfejsu dodał 20 ImageViev.
Szukałem w internecie ale nic nie znalazłem.

P.S Ja myślę że te programy właśnie tak robią. Jeśli się mylę to przepraszam

1

Zazwyczaj do takich rzeczy używa się RecyclerView z adapterem. Tutaj masz przykład jak coś takiego osiągnąć: https://developer.android.com/guide/topics/ui/layout/recyclerview

1

W tagach masz MySQL, więc najpierw krótkie słowo wstępu. Jedyny de facto rodzaj relacyjnych baz danych jaki Android wspiera lokalnie to SQLite. Jeżeli faktycznie chcesz korzystać z MySQL, czy czegoś innego niż SQLite, to musisz trzymać te dane na serwerze. Teortycznie możesz się bezpośrednio podłączyć do takiej bazy danych z poziomu Androida, ale nie jest to ani wygodne, ani bezpieczne, ani skalowalne, ani elastyczne. To, co musiałbyś zrobić w takim przypadku, to wystawić serwis, który byłby w stanie zwracać do aplikacji dane za pomocną np. HTTP i RESTa. Jeżeli elementów jest naprawdę dużo, to najlepiej, żeby endpoint zwracający te elementy wspierał paginację. Jeśli nie musi to być MySQL, to możesz skorzystać np. z Firebase.

Zakładając jednak, że to wyżej to bullshit i chodzi Ci o lokalną bazę danych, to można to rozwiązać za pomocą lokalnej bazy. Aplikacja może wtedy pytać się bazy o kolejne elementy i dodawać je do listy wyświetlania. Jeżeli chodzi natomiast o tworzenie 20 ImageView to tego się tak nie robi, ponieważ byłoby to bardzo niewydajne. Zamiast tego stosuję się pulę widoków.

Przykładowo - załóżmy że mamy w bazie 2000 elementów, ale na ekranie mieści się tylko 5. Po pierwsze, na początku pobieramy z bazy tylko 50 (ilość jest arbitralna, ale dużo mniejsza niż 2000), żeby nie ładować wszystkiego naraz do pamięci i w miarę szybko wyświetlić listę na ekranie. Aby ekran był zawsze zapełniony musimy utworzyć tylko 5 ImageView. Użytkownik w pewnym momencie zaczyna przewijać listę. Zamiast tworzyć kolejny ImageView, usuwamy zawartość starego i podmieniamy ją na tę, która ma się zaraz wyświetlić. W parktyce tworzy się kilka widoków więcej niż tyle, ile mieści się na ekranie, żeby mieć jakiś margines i nie było skoków podczas przewijania. Użytkownik dalej przewija tę listę i w pewnym momencie jest już blisko końca. W tym momencie prosimy bazę danych o kolejne 50 elementów, które możemy dodać do listy i tak w kółko, aż elementy się nie skończą.

Jeżeli miałbym polecić komponenty, z których można na szybko skorzystać w Androidzie, żeby zastosować to, co opisałem, to zainteresuj się:

  • RecyclerView - Widok służący do wyświetlania wielu elementów o jednolitej strukturze. Nie korzystaj z ListView. Jest to przestarzały komponent, który został całkowicie wyparty przez RecyclerView i może być traktowany jako relikt przeszłości. Bardzo ważna rzecz, o której ludzie mam wrażenie, że nigdy nie słyszeli, jak z nimi rozmawiam - razem z RecyclerView korzystaj z DiffUtils! I nie korzystaj z tego na głównym wątku.
  • Room - Warstwa abstrakcji nad SQLite, która zdecydowanie ułatwia pracę z bazą danych.
  • Paging library - Biblioteka służąca do stopniowego pobierania danych. Ma bardzą dobrą integrację z dwoma poprzednimi komponentami.

Hmmmm... informacji trochę dużo, ale akurat poruszyłeś taki temat.

0

Z tego co wiem to Sqlite jest lokalną bazą danych A Mysql jest na serwerze. Chciałbym dla nauki próbować Mysql. Serwer mam przygotowany I skrypty zwracające dane wartości są w trakcie tworzenia :-)

0

To w takim razie musisz wystawić jakiś serwis, który będzie operował na MySQL i to on będzie zwracał dane to aplikacji mobilnej. Podłączanie się do zewnętrznej bazy danych za pomocą telefonu komórkowego to okropny pomysł. Reszta w zasadzie taka sama - RecyclerView, DiffUtils, paginacja (tylko za pomocą zapytań do serwisu a nie to bazy danych).

0

U mnie to wygląda tak. Jest sobie serwer Apache I Mysql. Na Apache mam skrypty w PHP które pobierają dane z bazy I wysyłają je do aplikacji. Przy np. skrypcie on logowania aplikacja uzupełnia pola zmiennych w skrypcie. Czy to jest złe ?

0

Ja tam na PHP się nie znam, to nie powiem czy "uzupełnianie pól zmiennych w skrypcie" jest ok. Z punktu widzenia aplikacji mobilnej tak długo jak nie wystawiasz na zewnątrz bezpośredniego połączenia z bazą danych i komunikujesz się np. REST-em, to powinno być ok.

0

Baza nie jest wystawiona na połączenie się z zewnątrz.
A z uzupełnieniem pół chodzi o to że z aplikacji przekazuje dane do zmiennych, w których są nadpisywane

1

Jest bardzo fajna biblioteka roszerzająca RecyclerView: https://github.com/XRecyclerView/XRecyclerView - używasz tego tak samo, jak normalnego RecyclerView, a przy tym masz wbudowaną obsługę pull to refresh no i to, o czym tu piszemy, czyli paginacja/endless scrolling. Biblioteka rozszerza RecyclerView i po prostu wystawia 2 dodatkowe metody onRefresh (wywoływana, gdy użytkownik pociągnie listę w dół) i onLoadMore - gdy trzeba wczytać więcej danych:

mRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
    @Override
    public void onRefresh() {
      
    }

    @Override
    public void onLoadMore() {
     mRecyclerView.setNoMore(true); //Gdy już nie ma więcej danych do wczytania, ustawić to na true
    }
});

1 użytkowników online, w tym zalogowanych: 0, gości: 1